Comment effacer le cache gettext de php sans redémarrer Apache ni changer de domaine?
c'est un petit extrait de code de manuel php:
putenv('LC_ALL=zh_CN');
setlocale(LC_ALL, 'zh_CN');
bindtextdomain('domain', './locale');
textdomain('domain');
echo gettext('Hello');
qui produira 你好 comme défini dans domain.mo
le fichier, mais le problème est que tant que l'exécution d'Apache, gettext()
toujours retourner le résultat de cache.
Si je change la traduction de Bonjour您好domain.mo
, il va encore sortie 你好.
cependant il y a une correction pour cela en changeant le domain
l'argument de bindtextdomain()
et textdomain()
un nouveau nom. Comme d' "domain"
"domain2"
. Mais c'est vraiment douloureux d'éditer le fichier php à chaque fois que j'ai mis à jour le .mo
fichier.
y a-t-il une meilleure façon de faire cela, comme supprimer certains dossiers ou appeler certaines fonctions php pour faire le travail? Pour que je puisse écrire un petit script dans ce but.
6 réponses
chaque solution (1,2,3) suggère de changer le domain
pour se débarrasser du problème de cache, mais cela créera beaucoup de cache périmé en mémoire.
alors j'ai creusé dans la source gnu-gettext pour plus de détails sur la stratégie de cache (bindtextdom.C: 78.)
Quand bindtextdomain(domain, dirname)
est appelé, il vérifiera si domain
existe dans le cache; si oui, il va alors vérifier si dirname
est le même avec celui dans le cache. Si cela échoue, il va forcer une chasse d'eau de cache pour le même domaine, au lieu de créer un nouveau dans la mémoire.
la solution est incroyablement simple, d'abord créer un lien fictif vers le locale
dossier où votre .mo
le fichier est stocké:
cd locale
ln -s . nocache
Puis ajouter une seule ligne avant bindtextdomain()
bindtextdomain('domain', './locale/nocache');
bindtextdomain('domain', './locale');
maintenant le cache est forcé de tirer la chasse à chaque fois.
Mises à jour:
ce hack peut ne pas fonctionner dans certains cas (ne peut pas comprendre les conditions exactes.) Cette solution est quelque chose que vous devriez utiliser dans l'environnement de production, mais seulement pour ceux qui ont besoin de corriger quelque chose tout en gardant httpd en marche!
lorsque vous le pouvez, s'il vous plaît évitez d'utiliser gettext dès le début, c'est vraiment quelque chose d'ancien et devrait être déprécié pour de bon.
j'ai appelé clearstatcache();
fonction après la traduction de l' messages.po
messages.mo
et son fonctionnement sans redémarrer apache. Le chargement de chaque change ce que je fais dans n'importe quel fichier de langue.
ok, dans mon cas je devais redémarrer phpfpm en faisant le service php5.6-FPM-sp redémarrez.
si vous utilisez php-fpm, vous devez redémarrer phpfpm pour effacer le cache de gettext, redémarrer apache2 ne fonctionne pas.
l'Espoir est utile à quelqu'un d'autre.
la solution pour moi était de sauvegarder les fichiers avec un nom différent, en utilisant la date par exemple, puis en changeant le domaine:
#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);
il N'y a pas de façon directe de faire cela (à part le contournement du domaine que vous avez mentionné), c'est la raison pour laquelle nous utilisons php-gettext.
mise à jour: que nous avons commencé à maintenir comme motranslator, installable par Composer et compatible avec toutes les versions PHP.
Utiliser apachectl graceful
commande de demander au processus de relire la configuration.
Il terminera la requête une fois la requête terminée. Ça a l'air sûr.
Selon Apache HTTP Server 2.2 Documentation
le signal USR1 ou gracieux provoque le processus parent pour conseiller aux enfants de sortir après leur requête actuelle (ou de sortir immédiatement s'ils ne servent rien). Le parent re-lit ses fichiers de configuration et ré-ouvre ses fichiers de log. Comme chaque enfant meurent, le remplace par un enfant de la nouvelle génération de la configuration, qui commence à traiter les nouvelles demandes immédiatement.
Il a travaillé pour moi.