recargar - ¿Cómo borrar el caché gettext de php sin reiniciar Apache ni cambiar el dominio?
recargar pagina sin cache chrome (6)
Cada solución ( 1 , 2 , 3 ) sugiere cambiar el domain
para deshacerse del problema del caché, pero esto creará un montón de caché obsoletos en la memoria.
Así que busqué en la fuente gnu-gettext para obtener detalles sobre la estrategia de caché (bindtextdom.c: 78).
Cuando se bindtextdomain(domain, dirname)
, verificará si el domain
existe en el caché; si es así, verificará si dirname
es el mismo que el que está en el caché. Si esto falla, forzará un vaciado de caché para el mismo dominio, en lugar de crear uno nuevo en la memoria.
La solución es increíblemente simple, primero cree un enlace ficticio a la carpeta de locale
donde se almacena su archivo .mo
:
cd locale
ln -s . nocache
Luego agregue una sola línea antes de bindtextdomain()
bindtextdomain(''domain'', ''./locale/nocache'');
bindtextdomain(''domain'', ''./locale'');
Ahora el caché se ve obligado a vaciar cada vez.
Actualizaciones:
Es posible que este truco no funcione en algunos casos (no se pueden determinar las condiciones exactas). ¡Esta solución NO es algo que deba usar en el entorno de producción, sino solo para aquellos que necesitan arreglar algo mientras se ejecuta httpd!
Siempre que pueda, evite utilizar gettext desde el principio, esto es realmente algo antiguo y debería ser desechado para siempre.
Este es un pequeño fragmento de código del manual de php :
putenv(''LC_ALL=zh_CN'');
setlocale(LC_ALL, ''zh_CN'');
bindtextdomain(''domain'', ''./locale'');
textdomain(''domain'');
echo gettext(''Hello'');
Lo que generará 你好 como se define en el archivo domain.mo
, pero el problema es que mientras Apache se esté ejecutando, gettext()
siempre devuelve el resultado almacenado en caché.
Si cambio la traducción de Hello a 您好 en domain.mo
, aún saldrá 你好 .
Sin embargo, hay una solución para esto cambiando el argumento de domain
de bindtextdomain()
y textdomain()
a un nuevo nombre. Me gusta de "domain"
a "domain2"
. Pero esto es realmente doloroso editar el archivo php cada vez que actualizo el archivo .mo
.
¿Hay una forma mejor de hacerlo, como eliminar algunas carpetas o llamar a algunas funciones de php para hacer el trabajo? Para que pueda escribir un pequeño guión para este propósito.
En mi humilde opinión no hay una forma directa de hacerlo (además de la solución del dominio que ha mencionado), esa es la razón por la que estamos usando php-gettext .
Actualización: que hemos comenzado a mantener como motranslator , instalable por Composer y compatible con todas las versiones de PHP.
La solución para mí fue guardar los archivos con un nombre diferente, utilizando la fecha, por ejemplo, y luego cambiar el dominio:
#the path for a domain, the .mo files must match the domain
#the trick to avoid permanent caching, is to use different names for the domain, like the date messages_180320151250
$domain = ''messages_180320151300'';
#sets the path for a domain, the .mo files must match the domain
bindtextdomain($domain, $_SERVER[''DOCUMENT_ROOT'']."/apps/cp/locale");
textdomain($domain);
Llamé a clearstatcache();
funciona después de traducir de messages.po
a messages.mo
y funciona bien sin reiniciar Apache. Cargando cada cambio lo que estoy haciendo en cualquier archivo de idioma.
Utilice el comando apachectl graceful
para pedirle al proceso que vuelva a leer la configuración. Terminará la solicitud DESPUÉS de que la solicitud haya finalizado su publicación. Por lo que parece seguro.
Según la documentación de Apache HTTP Server 2.2
La señal USR1 o agraciada hace que el proceso padre indique a los niños que salgan después de su solicitud actual (o que salgan inmediatamente si no están sirviendo nada). El padre vuelve a leer sus archivos de configuración y vuelve a abrir sus archivos de registro. A medida que cada hijo muere, el padre lo reemplaza con un hijo de la nueva generación de la configuración, que comienza a atender nuevas solicitudes de inmediato.
Funciono para mi
ok, en mi caso necesitaba reiniciar phpfpm haciendo el servicio php5.6-fpm-sp restart.
Si está utilizando php-fpm, DEBE reiniciar phpfpm para borrar la memoria caché de gettext, el reinicio de apache2 no funciona.
La esperanza es útil para alguien más.