Embora muitas perguntas sobre SO já se relacionem a isso, elas são A) bem antigas e B) Achei melhor perguntar sobre isso aqui, pois parece estar relacionado a algum cache no nível do servidor, e não no nível da programação .
O problema é que nosso servidor, usando Apache e PHP, usa gettext
com os arquivos .po e .mo, na configuração nativa, ou seja, usando bindtextdomain
com a estrutura de pastas:
translations/
en_GB/
LC_MESSAGES/
mydomain.mo
fr_FR/
LC_MESSAGES/
mydomain.mo
para, por exemplo, carregar traduções em inglês e francês para o mydomain
domínio de texto. Carregar as traduções para o servidor e usá-las pela primeira vez com as funções nativas do PHP gettext()
, _()
, etc. funciona, tudo bem. O problema é que, quando atualizamos nossos arquivos .mo com novas traduções, essas atualizações não são aplicadas. Várias fontes afirmam que o servidor apache deve ser reiniciado para liberar o cache gettext:
etc.
Ainda é verdade até a data atual que os caches gettext de um aplicativo Apache-PHP podem ser liberados exclusivamente reiniciando o servidor apache? Não há outra abordagem para fazer isso? Considere que temos uma hospedagem VPS gerenciada, portanto, sem acesso root e não temos permissão para reiniciar o Apache em nosso servidor.
Eu sei que você poderia teoricamente implementar uma lógica que adiciona timestamps de suas modificações ao nome de domínio mydomain
, mas de acordo com este post aqui , "alterar o domínio para se livrar do problema de cache [...] -date cache in memory.", então estou me perguntando se essa abordagem é realmente viável.
PHP está rodando como php-cgi em nosso servidor Apache . Também observei agora que as LC_MESSAGES
pastas contêm um .nfs....
arquivo que aparentemente não consigo excluir (se eu excluí-lo, ele simplesmente reaparece). Isso pode indicar que meus .mo
arquivos foram reabertos/acessados por algum app, não fechado, e assim causar algum tipo de cache de tradução indesejado?
Eu tenho lido em vários lugares que esse cache gettext não deve ser um grande problema se o PHP não estiver sendo executado como um módulo Apache em seu servidor (e no meu exemplo, o PHP está sendo executado como FastCGI). E, de fato, o problema era na verdade outro:
locale -a
, tenho que ver se todos os nomes dos locais disponíveis incluem a codificação em seus nomes. Portanto, em vez de, por exemplo ,en_GB
efr_FR
, as localidades sãoen_GB.UTF-8
efr_FR.UTF-8
.Para estes:
Então, toda vez que atualizo o conteúdo dos meus
.mo
arquivos, apenas faço o login via ssh e executo:killall -9 php-cgi
E as novas traduções estão devidamente carregadas. Observe que nem uma reinicialização do Apache nem acesso root são necessários para fazer isso. Mas observe que o comando:
killall -9 php-cgi
Não teve efeito antes de incluir as codificações nos nomes das pastas de localidade; portanto, parece que os nomes das pastas de localidade (e as localidades que você especifica ao carregar textdomains em PHP) devem estar no mesmo formato que os nomes de localidade em seu servidor, obtidos via
locale -a
.