Pregunta

Quiero comenzar a usar gettext para manejar mis traducciones en proyectos web (PHP 5). Dado que es un estándar ampliamente utilizado con una buena reputación, parece ser la mejor opción.

Sin embargo, también escucho cosas sobre el servidor incompatiblemente y no es seguro para subprocesos. ¿Qué significa esto para mis proyectos que lo usan entonces? Como creo cosas que muchas personas usan, es muy importante que mi código funcione.

¿Estamos hablando de problemas menores (como personas que todavía usan PHP 4) o problemas importantes como la distribución e instalación de gettext en servidores web que son bajos?

¿Fue útil?

Solución

El problema de subprocesos solo se aplica si uno usa PHP incorporado (mod-php de Apache, por ejemplo) y ejecuta un servidor que usa subprocesos (como el servidor Apache con worker-mpm).

Entonces, el problema de seguridad del hilo no se aplica a usted si:

  1. usa el servidor NGINX (no usa subprocesos)
  2. Utiliza Apache (con MPM roscado o no) y PHP en modo fastcgi
  3. Utiliza Apache con MPM sin subprocesos (como prefork-MPM) y PHP en modo mod-php.

Entonces, la mayoría de las personas con la instalación predeterminada de Apache no deberían preocuparse de que gettext no sea seguro para subprocesos, ya que la instalación predeterminada de apache en la mayoría de las distribuciones usa prefork-MPM sin hilos

P.S. también, tenga en cuenta que Apache en Windows está enhebrado.

Otros consejos

Creo que jugar un poco más con la sección de comentarios del manual de php debería denunciar más información ... uno de los comentarios del manual en la sección gettext

  

La biblioteca gettext de GNU funciona en un   por proceso, no por subproceso.   Esto significa que en un multiusuario   configuración como el servidor web Apache   solo funcionará con un prefork MPM   (es decir, un proceso por usuario). Obrero   y otros MPM roscados no funcionarán.

     

Además, muchos usuarios controlan GNU   gettext configurando el entorno del sistema   variables como LANG. Esto no es una   buena solución para un servidor web   entorno debido a una carrera obvia   condición.

http://www.php.net/manual/en/gettext .setup.php

Tuve el mismo problema con PHP 5.6.30 VC11 Theard Safe en Windows 10. La solución encontró y solucionó este problema aquí por sirio3mil.

Aparentemente, PHP con TS solo puede acceder a la carpeta de idioma de Locale. Entonces, cuando la función setlocale y putenv se llama con un idioma diferente al del sistema, la carpeta con .mo y .po no se puede leer.

La solución consiste en tener solo una carpeta de idioma con el idioma del sistema y varios pares de archivos .mo / .po para cada idioma traducido. El dominio se configurará con el idioma deseado.

Ejemplo con francés suizo, alemán e italiano:

Estructura de carpetas

  

\ Locale \ fr_CH \ LC_MESSAGES

     
      
  • fr_CH.mo + fr_CH.po // lenguaje del 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top