我目前正在为我们的一个应用程序(使用PHP5.3编写)和使用Symfony2框架设置一个共享临时环境。
如果我只托pipe每个服务器的应用程序的单个实例,则一切正常。
但是,如果我然后部署应用程序的其他实例(可能或不可能共享完全相同的代码,这取决于客户端自定义),我得到这样的错误:
[Tue Nov 06 10:19:23 2012] [error] [client 127.0.0.1] PHP Warning: require(/var/www/vhosts/application1/httpdocs/vendor/doctrine-common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php): failed to open stream: Operation not permitted in /var/www/vhosts/application2/httpdocs/app/bootstrap.php.cache on line 1193 [Tue Nov 06 10:19:23 2012] [error] [client 127.0.0.1] PHP Fatal error: require(): Failed opening required '/var/www/vhosts/application1/httpdocs/app/../vendor/doctrine-common/lib/Doctrine/Common/Annotations/AnnotationRegistry.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/vhosts/application2/httpdocs/app/bootstrap.php.cache on line 1193
基本上,第二个网站试图要求来自第一个网站的文件,但由于open_basedir的限制,它不能这样做。 我不愿意禁用open_basedir,因为这只是掩盖问题而不是解决问题,并创build应用程序之间不应该存在的依赖关系。
我最初认为这与Symfony2错误有关,但现在我已经把它跟踪到了APC的一个问题; 禁用APC也解决了这个错误,但是我担心这样做会对性能造成影响。
有没有人有什么build议,我可以做什么?
好吧,原来这是我们自己的代码的问题,而不是APC或Symfony2的任何特别错误。
对于可能碰到这个问题的其他人的参考:
我们使用了Symfony2中的ApcUniversalClassLoader组件。
这使您可以为caching文件指定前缀。
这个前缀在我们的应用程序的每个实例中是相同的; 这就是为什么只要每个服务器只有一个实例,它就可以正常工作。
由于前缀相同,APC试图加载属于服务器重启后立即访问的应用程序的第一个实例的类。
将前缀更改为每个应用程序的不同实例会使其行为正确,从正确的文件夹加载类。
希望这样可以防止其他人在意识到为什么不工作的时候将他们的头撞到桌子上。