
Actualmente estoy configurando un entorno de prueba compartido para una de nuestras aplicaciones, escrita en PHP5.3 y usando el marco Symfony2.
Si solo alojo una instancia de la aplicación por servidor, todo funciona como debería.
Sin embargo, si luego implemento instancias adicionales de la aplicación (que pueden o no compartir exactamente el mismo código, dependiendo de las personalizaciones del cliente), obtengo errores 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
Básicamente, el segundo sitio intenta solicitar los archivos del primer sitio, pero debido a las restricciones de open_basedir no puede hacerlo. No estoy dispuesto a desactivar open_basedir ya que eso sólo enmascara el problema en lugar de resolverlo y crea una dependencia entre aplicaciones que no debería estar presente.
Inicialmente creí que esto estaba relacionado con un error de Symfony2, pero ahora lo he rastreado hasta un problema con APC; Deshabilitar APC también resuelve el error, pero me preocupa el impacto en el rendimiento al hacerlo.
¿Alguien tiene alguna sugerencia sobre lo que podría hacer?
Respuesta1
Bien, esto resultó ser un problema con nuestro propio código, en lugar de algo específicamente incorrecto con APC o Symfony2.
Para referencia de cualquier otra persona que pueda encontrarse con este:
Estábamos usando el componente ApcUniversalClassLoader de Symfony2.
Eso le permite especificar un prefijo para sus archivos de caché.
Este prefijo era el mismo en cada instancia de nuestra aplicación; por eso funcionó bien siempre que solo hubiera una instancia por servidor.
Como el prefijo era el mismo, APC intentó cargar las clases pertenecientes a la primera instancia de la aplicación a la que se había accedido inmediatamente después de reiniciar el servidor.
Cambiar el prefijo para que sea diferente por instancia de la aplicación hace que se comporte correctamente, cargando las clases desde las carpetas correctas.
Con suerte, esto evitará que alguien más se golpee la cabeza contra el escritorio cuando se dé cuenta de por qué no funciona :)