12
votes

Problèmes PHP GetText (comme non-thread-coffre-fort?)

Je veux commencer à utiliser GetText pour gérer mes traductions sur des projets Web (PHP 5). Comme il s'agit d'une norme largement utilisée avec une bonne réputation, il semble être le meilleur choix.

Cependant, j'entends également des choses sur le serveur incompatiblement et qu'il soit sans thread-coffre-fort. Qu'est-ce que cela signifie pour mes projets qui l'utilisent alors? Puisque je construis des choses que beaucoup de gens utilisent, il est très important que mon code fonctionne.

Parle-t-on de problèmes mineurs (comme les personnes qui utilisent toujours PHP 4) ou des problèmes majeurs tels que la distribution et l'installation de GetText sur Websevers sont bas?


0 commentaires

3 Réponses :


2
votes

Je pense que jouer un peu plus avec la partie de commentaires manuels PHP devrait réviler plus d'informations .... L'un des commentaires du manuel de la section GetText

La bibliothèque GNU GetText fonctionne sur un par processus, non par thread. Cela signifie que dans un multi-utilisateur réglage tel que le serveur Web Apache Cela ne fonctionnera que avec un MPM de préforboire (C'est-à-dire un processus par utilisateur). Ouvrier et d'autres MPM filetés ne fonctionneront pas.

En outre, de nombreux utilisateurs contrôlent GNU GetText en définissant l'environnement système variables telles que Lang. Ceci n'est pas un bonne solution pour un serveur Web environnement en raison d'une course évidente condition.

http://www.php.net/manual/fr/getext .Setup.php


2 commentaires

Je suppose que la question est alors, quelle est la bonne variable de Lang si vous ne pouvez pas le changer au moment de l'exécution après que vous sachiez ce que Lang l'utilisateur veut? Quel serait le point de GetText alors?


En effet, depuis que les variables d'environnement sont par procédé, j'ai du mal à voir la condition de course .... Si vous essayez de disposer de différents threads servir différentes traductions, vous voudrez quelque chose de différent bien sûr.



16
votes

Problème de threads s'appliquent uniquement si on utilise PHP incorporé (Apache's Mod-php par exemple) et exécute le serveur qui utilise des threads (comme Apache Server avec Worker-MPM).

SO - Le problème de sécurité du fil ne s'applique pas à vous si:

  1. Vous utilisez Nginx Server (il n'utilise pas de threads.)
  2. Vous utilisez Apache (avec MPM fileté ou non) et PHP en mode FastCGI
  3. Vous utilisez Apache avec MPM non fileté (comme préforquée-MPM) et PHP en mode MOD-PHP.

    SO - La plupart des personnes ayant une installation par défaut d'Apache Installation ne devraient pas s'inquiéter de GetText ne sont pas en sécurité, comme l'installation par défaut Apache dans la plupart des utilisations de la distrouge - MPM non fileté!

    P.s. Aussi - gardez à l'esprit que Apache sur Windows est fileté.


3 commentaires

J'exécute PHP sous forme de 10 processus FastCGI sur Linux qui sont appelés sur Nginx en cas de besoin. Si vous exécutez le processus PHP en tant que CGI, c'est si fileté?


@Xeoncross: Vous n'avez rien à craindre. Nginx n'utilise pas de threads. Et aussi - vous exécutez PHP en tant que CGI (php-fpm i espoir) - il fonctionne donc comme un serveur de ses propres conditions, aucune condition de course GetText liée à la locale n'est possible.


En fait, je l'exécute toujours comme un démon - j'ai besoin de passer à PHP-FPM maintenant qu'il est livré avec PHP 5.3.



0
votes

J'ai eu le même problème avec PHP 5.6.30 VC11 Theard Safe Safe sur Windows 10. Solution de contournement trouvé et corrigez ce problème ici par sirio3mil.

apparemment php avec TS peut accéder uniquement à un dossier LIGALE LANGUE. Ainsi, lorsque la fonction SETLOCALE ET PUTENV appelle une autre langue que celle du système, le dossier avec .mo et .po ne peut pas être lu.

Solution de contournement doit avoir un seul dossier de langue avec la langue du système et plusieurs paires de .mo. /.po fichiers pour chaque langue traduite. Domaine sera défini avec la langue souhaitée.

Exemple avec le français suisse, l'allemand et l'italien:

Structure de dossier

\ locale \ fr_ch \ lc_messages

  • fr_ch.mo + fr_ch.po // langage système
  • DE_CH.MO + DE_CH.PO
  • IT_CH.MO + IT_CH.PO

    code xxx


1 commentaires

Cela ne fonctionne pas pour moi. :-(