2009-05-04 21 views
5

Recientemente hemos habilitado APC en nuestros servidores, y ocasionalmente cuando publicamos código nuevo o cambios descubrimos que los archivos de origen que fueron cambiados comienzan a arrojar errores que no están reflejados en el código, generalmente analizados errores que describen un token que no existe. Hemos verificado esto ejecutando php -l en los archivos que los registros de errores dicen que están afectados. Por lo general, una republica soluciona el problema. Estamos usando PHP 5.2.0 y APC 3.01.9. Mi pregunta es, ¿alguien más ha experimentado este problema, o alguien reconoce cuál es nuestro problema? Si es así, ¿cómo lo solucionó o cómo podríamos solucionarlo?Problemas con APC en publicar

Editar: Probablemente debería agregar algunos detalles sobre nuestro proceso de publicación. El contenido se envía a los servidores de producción a través de rsync desde un servidor intermedio. Hemos habilitado apc.stat_ctime porque dice que esto ayuda a que las cosas funcionen mejor con rsync. apc.write_lock está activado por defecto y no lo hemos desactivado. Ídem para apc.file_update_protection.

+1

¿Qué es APC (todos los APC que se me ocurren no tienen sentido en este contexto)? –

+1

Brian, es un caché de código de operación para acelerar la ejecución de PHP. Le puse un enlace en el texto de la pregunta si desea saber más. –

+0

desordenado! ¿Esto también ocurre al copiar archivos localmente en lugar de sincronizarlos? – stefs

Respuesta

7

Parece que un archivo parcialmente publicado se está leyendo y almacenado en caché como roto. apc.file_update_protection está diseñado para ayudar a detener esto.

en php.ini: apc.file_update_protection integer

apc.file_update_protection establecer pone un retraso en el almacenamiento en caché de la marca nuevos archivos. El valor predeterminado es 2 segundos, que significa que si la modificación marca de tiempo (mtime) en un archivo muestra que tiene menos de 2 segundos cuando se accede a , no se almacenará en caché. La persona desafortunada que accedió a este archivo medio escrito aún verá rareza, pero al menos no persistirá .

Después de la pregunta que se está editando: Una razón por la que no veo este tipo de problemas es que presiono una copia completamente nueva del sitio (con la exportación de SVN). Solo después de que esté completamente completo se vuelve visible para Apache/Mod_php (vea mi respuesta How to get started deploying PHP applications from a subversion repository?)

La otra cosa que puede pasar, por supuesto, es que si está actualizando en su lugar, puede estar actualizando archivos que dependen de otros que aún no han sido cargados. Rsync solo puede garantizar actualizaciones atómicas para archivos individuales, no la colección completa que se está modificando/cargando. Otra razón por la que creo que es subir el sitio en masa, y solo luego ponerlo en uso.

0

Nunca vi eso antes, incluso si soy un gran usuario de APC. Quizás intente desencadenar un script que vacíe el código de operación de APC cada vez que envíe código nuevo en el servidor.

0

Cuando obtenga un archivo con un error de análisis, haga una copia de seguridad y luego vuelva a publicar. Toma el mismo archivo que ahora funciona y haz un diff contra el archivo con el error de análisis.

4

Parece que APC no se está ejecutando o no está obteniendo la información de archivo correcta. Puede verificarlo para asegurarse de que la configuración de APC apc.stat esté configurada correctamente. Otra cosa que podría hacer es forzar que la memoria caché se borre con apc_clear_cache() cuando publique código nuevo.

0

ctime significa tiempo de creación. Deberá vaciar manualmente el caché completo cada vez que realice actualizaciones.

Puede hacer esto fácilmente, colocando el script apc.php en algún lugar de su servidor. Este script le proporciona estadísticas de caché y le permitirá descartar el caché.

El script viene con APC.

Hopet su ayuda, Evert

0

Esto probablemente sucede porque hay una falta de correspondencia entre el código y las versiones en caché del código.

Por ejemplo, APC tiene una versión almacenada en caché de User.php, pero ha realizado cambios en User.php o en los datos que usa el usuario. La versión en caché todavía se está ejecutando incluso después de su implementación, porque aún no ha caducado.

Si borra las entradas de caché de APC cuando implementa, este problema debería desaparecer.