
Atualmente estou configurando um ambiente de teste compartilhado para um de nossos aplicativos, escrito em PHP5.3 e usando o framework Symfony2.
Se eu hospedar apenas uma única instância do aplicativo por servidor, tudo funcionará como deveria.
No entanto, se eu implantar instâncias adicionais do aplicativo (que podem ou não compartilhar exatamente o mesmo código, dependendo das personalizações do cliente), recebo erros como este:
[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
Basicamente, o segundo site está tentando exigir os arquivos do primeiro site, mas devido às restrições do open_basedir ele não pode fazer isso. Não estou disposto a desabilitar o open_basedir, pois isso apenas mascara o problema em vez de resolvê-lo e cria uma dependência entre aplicativos que não deveria estar presente.
Inicialmente, acreditei que isso estava relacionado a um erro do Symfony2, mas agora descobri que era um problema com a APC; desabilitar o APC também resolve o erro, mas estou preocupado com o impacto no desempenho disso.
Alguém tem alguma sugestão sobre o que eu posso fazer?
Responder1
Ok, isso acabou sendo um problema com nosso próprio código, e não algo especificamente errado com o APC ou o Symfony2.
Para referência de qualquer outra pessoa que possa se deparar com este:
Estávamos usando o componente ApcUniversalClassLoader do Symfony2.
Isso permite que você especifique um prefixo para seus arquivos de cache.
Esse prefixo era o mesmo em cada instância do nosso aplicativo; é por isso que funcionou bem desde que houvesse apenas uma instância por servidor.
Como o prefixo era o mesmo, a APC tentou carregar as classes pertencentes à primeira instância da aplicação que foi acessada imediatamente após a reinicialização do servidor.
Alterar o prefixo para ser diferente por instância da aplicação faz com que ela se comporte corretamente, carregando as classes das pastas corretas.
Esperançosamente, isso impedirá que alguém bata a cabeça na mesa quando perceber por que não está funcionando :)