open_basedir problemas com APC e Symfony2

2

Atualmente, estou configurando um ambiente de preparação compartilhado para um de nossos aplicativos, escrito em PHP5.3 e usando a estrutura do 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), obtenho 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 a restrições do open_basedir ele não pode fazer isso. Eu não estou disposto a desabilitar o open_basedir, pois isso é apenas mascarar o problema em vez de resolvê-lo, e cria uma dependência entre os aplicativos que não devem estar presentes.

Inicialmente, acreditei que isso estava relacionado a um erro do Symfony2, mas agora o rastreei até um problema com a APC; desativar 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?

    
por Steve Hill 06.11.2012 / 11:41

1 resposta

1

Ok, isso acabou sendo um problema com nosso próprio código, em vez de algo especificamente errado com o APC ou o Symfony2.

Para a referência de qualquer outra pessoa que possa se deparar com essa:

  1. Estávamos usando o componente ApcUniversalClassLoader do Symfony2.

  2. Isso permite que você especifique um prefixo para seus arquivos de cache.

  3. 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.

  4. Como o prefixo era o mesmo, a APC tentou carregar as classes pertencentes à primeira instância do aplicativo que havia sido acessado imediatamente depois que o servidor foi reiniciado.

  5. Alterar o prefixo para ser diferente por instância do aplicativo faz com que ele se comporte corretamente, carregando as classes das pastas corretas.

Espero que isso impeça que qualquer outra pessoa bata a cabeça na mesa quando perceberem por que ela não está funcionando:)

    
por 07.11.2012 / 16:27