APC操作码缓存导致应用程序出现问题

3

我使用Composer安装Zend Framework 2和其他库。每次在相同路径重新安装应用程序后,我都必须手动清除APC(版本3.1.13)opcode缓存(使用PHP 5.4.8),否则我会遇到如下错误:

PHP Fatal error:  Interface 'Zend\\Mvc\\ApplicationInterface' not found

或者

PHP Fatal error:  include(): Cannot redeclare class zend\\eventmanager\\eventscapableinterface

每次应用程序安装后,失败的类都会发生变化。我已经设置了apc.stat=1,因此如果我在相同的路径部署应用程序,则操作码缓存应该自动注意到新部署的php文件并重新编译它们。

我已经在Github上与composer开发人员讨论了这个问题,并在这里发布了我的APC设置:https://github.com/composer/composer/issues/1662。我们认为这更像是一个APC问题。


我猜我可以使用这里有点复杂的解决方案来自动清除APC opcode缓存:https://dev59.com/U3NA5IYBdhLWcg3wkuzO#3580939。但我希望有一些更简单的解决方法。 - aimfeld
1
触摸(touch)所有更新的文件,以便它们具有新的时间戳。apc相当愚蠢。 - Wrikken
我在邮件列表的某个地方看到了关于APC和PHP5.4存在问题的信息,不幸的是我找不到它,无法查看具体内容。 - Zdenek Machek
这个问题有帮助吗?PHP with APC: Fatal errors: Cannot redeclare class ... 一个建议是尝试更改 apc.include_once_override = 0 - Simon Hampel
感谢您的建议! @SimonHampel 我已经有了apc.include_once_override = 0,请参见这里。 @ZdenekMachek 我会尝试的,但是由于我在重新安装时删除了整个供应商文件夹(包含Zend Framework),然后再次安装其内容(从composer缓存中),所以文件时间戳应该会自动更新。 - aimfeld
@Wrikken:谢谢,确实触及所有文件可以解决问题: find . -exec touch {} \; 如果您愿意,将其作为答案提供,以便我可以接受并点赞! - aimfeld
1个回答

0

我认为是 include_path 被设置了两次。当 include_path 被调用两次时,会让 APC 读取和解析变得混乱。请确保您的 ZEND 项目没有在 include_path 上被调用两次。

另外,请检查您是否正确配置了 ini 设置或手动输入了 ini 设置数据:

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

与此同时,由于更新,这个问题可能已经得到解决。


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