PHP与APC:致命错误:无法重新声明课程

时间:2011-01-01 19:19:28

标签: apc php

由于我使用PECL安装了APC for PHP,我有时会遇到这些错误:Cannot redeclare class xxx

xxx不时变化。我可以禁用APC,但APC可以提高性能!是否存在已知错误或我可以采取其他措施来防止这些错误?我正在使用Ubuntu 8.04 LTS和PHP 5.2.4。


编辑/更新(来自评论):

我使用Zend Framework Autoloader,在启用APC之前从未发生过这些错误。不久之前,我得到了一个错误:Fatal error: require(): Cannot redeclare class zend_db_adapter_abstract in /paths/app/lib/Zend/Db/Select.php on line 27

7 个答案:

答案 0 :(得分:13)

以下配置的组合为我修复了它:

apc.include_once_override = 0
apc.canonicalize = 0
apc.stat = 0

如果没有全部3,我会经常收到错误,但 所有三个我似乎不再收到错误:)!

答案 1 :(得分:12)

一旦启用APC,我就遇到了一堆PHP库的问题。经过大量的拔毛后,我发现设置apc.include_once_override = 0清除了一切。仍然监控但没有重新出现问题(在此之前我能够通过清除apc缓存来引发错误)。

答案 2 :(得分:3)

AWS SDK下运行的php脚本中使用Amazon的PHP2 cron时发生此错误。一种解决方案是通过apc禁用-d apc.enabled=0,如下所示:

/usr/bin/php -d apc.enabled=0 /path/to/myshelljob.php

more info

答案 3 :(得分:2)

嗯,似乎是common issue

我刚才从您的特定错误消息中注意到,您以全小写形式编写了zend_db_adapter_abstract。可怕的框架命名方案和自动加载器的一个问题是它们将文件保持在大小写混合的情况下并期望它。如果你的代码尝试以这种方式实例化它,那么自动加载器可能没有找到它。 APC在这里可能更为奇特,因为它在内部覆盖include_once,可能带有副作用。

解决方案是调整Zend自动加载器,并手动保存加载类和(绝对和小写)文件名列表以进行校对,以代替include_once。

否则,请尝试过多的xdebuging。无法访问您的设置,我们所能做的就是猜测。

答案 4 :(得分:1)

apc的一个已知问题是它混合了来自不同位置的include_once directivse。

因此,如果您执行include_once myclass.php然后在子目录中,include_once ../myclass.php apc可能会将其混淆并考虑其不同的文件并将其加载两次。

然而,这在以后的版本中已得到修复。

如果您可以将代码深入到已加载两次的类中,则可以检查该类是否已加载class_defined或某些可调用的东西。

您还可以使用apc.filter指令来阻止某些文件缓存。

答案 5 :(得分:1)

下载latest apc版本并使用:

[APC]
apc.cache_by_default = 0

使用apc.stat = 0服务器将php文件加载到缓存中,如果你修改它,php仍会加载相同的文件。

更多信息:

答案 6 :(得分:0)

我只是遇到了这种情况,在其他任何答案中都没有找到建议的解决方案。我正在使用各种自动加载器,包括Composer自动加载器和旧版的Zend Framework自动加载器。

该问题原来是由文件名和类名之间的轻微名称不匹配引起的。类名和文件名之间的字符不同-人类可能容易错过的差异,但是几个自动装带器相继$(selector).on('slidechange', callback) 写入同一文件,从而导致错误。