为什么apc_store()会返回false?

20

php.net 上的文档在解释 APC 写入失败的原因方面非常缺乏。会有什么情况导致调用 apc_store() 失败呢?

磁盘空间充足,但是失败情况比较零散。有时候存储操作会成功,而有时则会失败。

9个回答

55

对于php cli,需要使用另一个选项启用:apc.enable_cli=On

在我的情况下,在Web浏览器中运行时它是可以工作的,但是当使用php cli执行相同的内容时却无法工作。


7
您可以在命令行中使用 php -d apc.enable_cli=1 命令启用此功能。 - cbednarski
如果你使用PHPUnit测试你的代码,并且使用APC变量存储,那么一定要打开它。我花了太长时间才弄清楚这个问题。 - Sverri M. Olsen
@Sverri:嗯,不错...但是我怎么才能将其打开仅针对特定命令?例如,在phpunit.xml.dist中,或作为phpunit的命令行参数? - donquixote
好的,如果我运行php -d apc.enable_cli=1 /home/thisisme/pear/bin/phpunit,而不是直接运行phpunit,它就可以工作。 - donquixote
为什么这是默认行为?这应该在文档中清楚地说明。 - Chibueze Opata

10

我曾遇到过完全相同的情况。

我将我的代码从使用 Cron 作业迁移到使用由 supervisord 管理的 Gearman Workers。

一切都坏了。 我无法通过 APC 获取缓存,并不得不恢复使用基于文件的缓存。

最终,我发现当我使用 Cron 作业时,我会通过 wget 加载每个页面,而不是通过命令行。 这个差异意味着 supervisord 会通过命令行加载我的 PHP 脚本,但默认情况下 APC 不能够通过命令行工作。

解决方法如下:

apc.enable_cli=On


6

内存不足(分配给APC的内存)


4

这个愚蠢的(而且不知何故被关闭的)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') );


2

1

磁盘空间不足或无权访问存储目录?


apc_store() 将数据存储在内存中,而不是磁盘上。 - Frank Farmer

1
除了Greg所说的,我还要补充一点,配置错误可能会导致这种情况发生。

1

0

如果特定的键已经存在并且在TTL过期之前尝试再次写入它,则apc_store将失败。因此,您可以基本上忽略返回false,因为它确实失败了,但缓存仍然存在。如果要解决此问题,请开始使用apc_add。http://php.net/manual/en/function.apc-add.php


4
apc_store() 函数会覆盖现有的键值而不会失败(--> 它会返回 true)。apc_add() 才是真正会在重复键值出现时失败的函数(正如函数名所示)。 - KingCrunch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接