problemas PHP Gettext (como non-thread-safe?)
-
22-07-2019 - |
Pergunta
Eu quero começar a usar gettext para lidar com minhas traduções em projetos web (PHP 5). Uma vez que é um padrão amplamente utilizado com uma boa reputação parece ser a melhor escolha.
No entanto, eu também estou ouvindo coisas sobre servidor incompatibly e sendo-non-thread-safe. O que isso significa para os meus projetos que usam então? Desde que eu construir coisas que muitas pessoas usam, é muito importante que as minhas obras de código.
Estamos a falar de problemas menores (como as pessoas ainda usam PHP 4) ou grandes problemas como a distribuição e instalação de gettext em websevers sendo baixo?
Solução
Threads problema só se aplica se uma utilidades embutido PHP (mod-php de Apache por exemplo) e corre servidor que usa segmentos (como o servidor Apache com o trabalhador-MPM).
Assim - questão de segurança rosca não se aplica a você se:
- você usa servidor NGINX (ele não usa threads.)
- Você usa Apache (com qualquer um threaded MPM ou não) e PHP em modo fastcgi
- Você pode usar o Apache com MPM non-threaded (como prefork-MPM) e PHP em modo de mod-php.
Assim - a maioria das pessoas com padrão Apache instalação não deve se preocupar com gettext não ser thread-safe, como padrão do Apache de instalar em usos de mais distro non-threaded prefork-MPM
P.S. também -. manter em mente que o Apache no Windows é enfiada
Outras dicas
Eu acho que jogar um pouco mais com o php parte manuais comentários devem injuriarem mais informações .... um dos comentários no guia sobre seção gettext
O GNU gettext biblioteca funciona em um por processo, não base por linha. Isto significa que em um multi-usuário colocação como o servidor web Apache ele só vai funcionar com um MPM prefork (Isto é, um processo por utilizador). Trabalhador e outros MPMs rosca não vai funcionar.
Além disso, muitos usuários controlar GNU gettext pelo ambiente do sistema configuração variáveis ??como LANG. Esta não é uma boa solução para um servidor web meio ambiente devido a uma corrida óbvio condição.
Eu tive mesmo problema com o PHP 5.6.30 VC11 Theard Seguro no Windows 10. Solução encontrada e corrigir esse problema aqui por sirio3mil.
Aparentemente PHP com TS pode acessar somente pasta do idioma Locale. Então, quando setlocale e função putenv é chamada com outra língua de um sistema, pasta com .mo e .po não podem ser lidos.
Solução alternativa é ter apenas uma pasta do idioma com idioma do sistema e vários pares de .mo / .po arquivos para cada idiomas traduzidos. Domínio será definido com a linguagem queria.
Exemplo com a Swiss francês, alemão e italiano:
Pasta estrutura
\ Locale \ fr_CH \ LC_MESSAGES
linguagem
- fr_CH.mo + fr_CH.po // sistema
- de_CH.mo + de_CH.po
- it_CH.mo + it_CH.po
Código
$lang = 'fr_CH' or 'de_CH' or 'it_CH'
bindtextdomain($lang, '.\Locale');
textdomain($lang);
bind_textdomain_codeset($lang, 'UTF-8');
setlocale (LC_ALL, $lang);
putenv('LC_ALL=' . $lang);