PHP - Forçando atualizado do Getext
Olá meus Unicórnios! 🦄✨
Utilizar arquivos ".mo" e ".po" para gerenciar o idioma do site não é novidade, é uma forma extremamente eficiente, rápida e simples.
A configuração do PHP é extremamente simples:
putenv("LC_ALL=en");
setlocale(LC_ALL, "en");
bindtextdomain("messages", __DIR__ . "/Idiomas/");
textdomain("messages");Onde será buscado os arquivos de idioma, do idioma Inglês (en), de:
./Idiomas/en/LC_MESSAGES/messages.moPorem, você deve ter observado que ao atualizar o arquivo ".po" e compilar o arquivo ".mo", as atualizações não são refletidas no site, sendo necessário reiniciar o servidor do PHP (Apache, IIS, etc)!
Mas Porque isto Ocorre?
O Getext é extremamente rápido, e precisa ser, imagina buscar todos os termos diretamente do arquivo local, iria gerar um gargalo gigante.
Para ser tão rápido, o PHP armazena todos os termos na memória ram do servidor.
Podemos comparar ao MemCache, um cache de memória ram extremamente rápido.
O problema é que o php não disponibiliza uma função para limpar o cache do Getext, então, a limpeza só ira acontecer quando o PHP recarregar o arquivo local.
E como Resolver?
A única situação na qual o php ira atualizar este cache é se mudarmos o arquivo de contexto.
Ou seja, ao invés de buscar o arquivo "messages.mo", agora deve buscar o arquivo "messages_2.mo".
Afinal, se mudou o arquivo, a referencia que o php ira buscar na memória não ira existir.
Podemos simplificar isto através de uma configuração de versão.
Então, considerando que fizemos uma mudança em alguns temos do arquivo de idiomas, atualizamos uma configuração interna do projeto (Onde você armazena configurações do projeto, como "Nome" do site), para indicar que a versão do idioma mudou.
Para exemplo, iremos subir a versão para "3", então temos que deletar a versão "2" e criar a versão "3" copiando o "messages.mo":
<?
// Deletamos a versão 2
@unlink(__DIR__ . "/Idiomas/en/LC_MESSAGES/messages_2.mo");
// Criamos a versão 3
@copy(__DIR__ . "/Idiomas/en/LC_MESSAGES/messages.mo", __DIR__ . "/Idiomas/en/LC_MESSAGES/messages_3.mo");
?>E depois, atualizamos as configurações de contexto:
<?
putenv("LC_ALL=en");
setlocale(LC_ALL, "en");
bindtextdomain("messages_3", __DIR__ . "/Idiomas/");
textdomain("messages_3");
?>Por hoje é só, meus unicórnios! 🦄✨
Que a magia do arco-íris continue brilhando em suas vidas! Até mais! 🌈🌟
Leia também
API Mágica: notificações Web Push no navegador com PHP
Web Push com a API Mágica em PHP puro: o navegador se inscreve, o seu site envia a notificação e a API conta o clique. Sem Composer e sem biblioteca.
IndexNow: avisando o Bing e o Yandex mais rápido
Como criar a chave do IndexNow e avisar Bing e Yandex das suas páginas novas com Node.js e PHP: as requisições, os erros reais e as armadilhas.
llms.txt: por que importa e como gerar em PHP
Por que o llms.txt importa para quem quer ser citado pela IA, e como gerar o seu em PHP puro lendo o sitemap.xml que voce ja tem.