关于 APC 写入失败的原因,php.net 上的文档参差不齐。什么样的场景会导致调用 apc_store() 失败?
有大量可用的磁盘空间,而且故障参差不齐。有时存储操作会成功,有时会失败。
对于 php cli,需要使用另一个选项启用:apc.enable_cli=On
在我的情况下,它在从 webbrowser 运行时可以工作,但在使用 php cli 执行相同的东西时却不行。
我有完全相同的情况。
我将我的代码从使用 Cron Jobs 迁移到使用通过 supervisord 管理的 Gearman Workers。
一切都崩溃了。我无法让缓存通过 APC 工作,不得不恢复使用文件库缓存。
最终我发现当我使用 cron 作业时,我会通过 wget 而不是命令行加载每个页面。这种差异意味着通过命令行加载我的 PHP 脚本的 supervisord 将无法工作,因为默认情况下 APC 将无法通过命令行工作。
修复....
apc.enable_cli=On
内存不足(即为 apc 分配的内存)
这个 asinine(并且由于某种原因已关闭)错误是我的问题:
http://pecl.php.net/bugs/bug.php?id=16814
必须回滚到 apc 版本 3.1.2 才能使 apc 工作。没有摆弄 php.ini 中的 apc 设置有帮助(我在 mac os 10.5 上,使用 apache 2,php 5.3)。
对我来说,这个测试脚本显示了 3.1.2 的 3 个“真”和 3.1.3p1 的真/假/真
var_dump(apc_store('test', 'one') ); var_dump(apc_store('test', 'two')); var_dump(apc_store('diff', 'thr'));
http://php.net/manual/en/apc.configuration.php
php.ini 上的 apc.ttl 和 apc.user_ttl 设置:
将此保留为零意味着 APC 的缓存可能会被陈旧的条目填满,而不会缓存较新的条目。
磁盘空间不足或存储目录权限被拒绝?
除了 Greg 所说的之外,我还要补充一点,配置错误可能会导致这种情况。
使用 ubuntu 10.04 和 debian stable 安装的版本存在错误。如果你用这个版本替换这个包:http ://packages.debian.org/sid/php-apc (3.1.7) 它可以正常工作。
如果该特定密钥已经存在并且您尝试在 TTL 到期之前再次写入它, apc_store 将失败。因此,您几乎可以忽略返回 false,因为它确实失败了,但缓存仍然存在。如果您想解决这个问题,请开始使用 apc_add 代替。 http://php.net/manual/en/function.apc-add.php