2012-02-12 23 views
6

Tengo un problema donde ejecutamos una actualización para nuestra aplicación web.clearstatcache + include_path + sessions

Después de que el script de actualización finalice y acceda a la aplicación web a través del navegador, obtenemos errores de archivo no encontrados en require_once() porque cambiamos algunos archivos y PHP aún tiene la estructura de directorios anterior en caché.

Si tenemos los 120 segundos predeterminados para que realpath_cache_ttl expire, todo se resuelve solo, pero esto no es aceptable por razones obvias.

Así que traté de usar clearstatcache con un éxito limitado. He creado un archivo separado (clearstatcache.php) que sólo llama a esta función (este es un archivo de una línea), y se coloca una llamada a ella en nuestro script de instalación a través de rizo:

<?php 
clearstatcache(true); 

Esto no parece funcionar Sin embargo, si llamo a este archivo a través del navegador, inmediatamente comienza a funcionar.

estoy corriendo la versión PHP 5.3

empecé a ver las diferencias encabezado de solicitud entre el navegador y el rizo, y la única cosa que puedo ver que podría ser importante es la cookie PHPSESSID.

Así que mi pregunta es, ¿importa el PHPSESSID actual (no creo que debería). ¿Estoy haciendo algo mal con mi secuencia de comandos curl? Estoy usando

curl -L http://localhost/clearstatcache.php 

EDIT: Sobre la investigación adicional, he decidido esto probablemente tiene algo que ver con múltiples procesos de Apache corriendo. clearstatcache solo borrará el caché del proceso de apache actual: cuando el navegador realiza una solicitud, un proceso de apache diferente atiende la solicitud, y este proceso aún tiene el caché anterior.

+0

AFAIK 'realpath_cache_ttl' y' realpath_cache_size' solo deberían afectar las rutas reales, las rutas al archivo que existe. Al menos esto está demostrado por el hecho de que tengo los valores predeterminados de 120s y 16K en todos mis proyectos y nunca he experimentado tales problemas. ¿Usas alguna caché de código de operación? – zerkms

+0

tiene la razón, la caché es por proceso. – goat

Respuesta

1

Dado que la memoria caché es parte del proceso hijo de Apache gracias a mod_php, su solución aquí probablemente será reiniciar el servidor Apache.

Si usaba FastCGI (en Apache u otro servidor web), la solución probablemente reiniciaría el gestor de procesos que estaba utilizando.

Este paso probablemente debería formar parte de su plan de despliegue estándar. Tenga en cuenta que puede haber otros cachés que también podría necesitar borrar.

+0

Downvoter, realmente agradecería algunos comentarios útiles. – Charles

+0

Por lo que puedo decir, esta es la única solución en este momento. Si pudieras conectarte de alguna manera con cada proceso de apache y clearstatcache, esa sería la mejor solución, pero hasta que descubra cómo hacerlo, esta es la única solución. –

+0

Hasta donde sé, no hay forma de dirigir una solicitud HTTP a un niño Apache específico. Eso * sería * muy útil. Puede intentar abrir tantas conexiones persistentes como niños Apache, aunque eso probablemente consumirá más recursos y tiempo que un reinicio seguro. – Charles

Cuestiones relacionadas