php.net 上的文档在解释 APC 写入失败的原因方面非常缺乏。会有什么情况导致调用 apc_store() 失败呢?
磁盘空间充足,但是失败情况比较零散。有时候存储操作会成功,而有时则会失败。
对于php cli,需要使用另一个选项启用:apc.enable_cli=On
在我的情况下,在Web浏览器中运行时它是可以工作的,但是当使用php cli执行相同的内容时却无法工作。
我曾遇到过完全相同的情况。
我将我的代码从使用 Cron 作业迁移到使用由 supervisord 管理的 Gearman Workers。
一切都坏了。 我无法通过 APC 获取缓存,并不得不恢复使用基于文件的缓存。
最终,我发现当我使用 Cron 作业时,我会通过 wget 加载每个页面,而不是通过命令行。 这个差异意味着 supervisord 会通过命令行加载我的 PHP 脚本,但默认情况下 APC 不能够通过命令行工作。
解决方法如下:
apc.enable_cli=On
内存不足(分配给APC的内存)
这个愚蠢的(而且不知何故被关闭的)bug是我的问题:
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个“true”,在3.1.3p1上则显示了true/false/true。
var_dump( apc_store('test', 'one') ); var_dump( apc_store('test', 'two') ); var_dump( apc_store('diff', 'thr') );
http://php.net/manual/zh/apc.configuration.php
在php.ini中,apc.ttl和apc.user_ttl设置如下:
将其设为零意味着APC的缓存可能会被过期的条目填满,而新的条目不会被缓存。
磁盘空间不足或无权访问存储目录?
在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
apc_store()
函数会覆盖现有的键值而不会失败(--> 它会返回 true
)。apc_add()
才是真正会在重复键值出现时失败的函数(正如函数名所示)。 - KingCrunch
php -d apc.enable_cli=1
命令启用此功能。 - cbednarski