PHP Gettext Probleme (wie nicht-Thread-sicher?)
-
22-07-2019 - |
Frage
Ich möchte mit gettext starten, um meine Übersetzungen auf Webprojekte (PHP 5) zu behandeln. Da es ein weit verbreiteter Standard mit einem guten Ruf ist, scheint es die beste Wahl zu sein.
Allerdings bin ich auch Dinge über Server hören inkompatibel und es ist nicht Thread-sicher. Was bedeutet das für meine Projekte, die sie dann verwenden? Da ich die Dinge zu bauen, dass viele Menschen nutzen, ist es sehr wichtig, dass mein Code funktioniert.
Sprechen wir über kleinere Probleme (wie die Menschen immer noch mit PHP 4) oder großen Problemen wie Verteilung und Installation von gettext auf websevers niedrig ist?
Lösung
Themen Problem gilt nur, wenn ein eingebettetes verwendet PHP (Apache mod-php zum Beispiel) und läuft Server, den Threads verwendet (wie Apache-Server mit Arbeiter-mpm).
So - Thread-Sicherheit Problem gilt nicht für Sie, wenn:
- verwenden Sie NGINX Server (es keine Threads nicht verwendet.)
- Sie verwenden Apache (entweder mit Gewinde MPM oder nicht) und PHP in FastCGI-Modus
- Sie verwenden Apache mit non-threaded MPM (als prefork-MPM) und PHP in mod-php-Modus.
So - die meisten Menschen mit Standard-Apache installieren sollte nicht über gettext Sorge Thread-sicher zu sein, als Standard-Apache in den meisten Distributionen installieren verwendet gewindelosen prefork-MPM
P. S. auch -. Bedenken Sie, dass Apache auf Windows Gewinde versehen ist,
Andere Tipps
Ich denke, einige mehr mit dem PHP-Handbuch Kommentare Teil spielen sollte mehr Informationen .... einer der Kommentare aus dem Handbuch auf gettext Abschnitt schmähen
Die GNU gettext Bibliothek arbeitet auf per-Prozess, nicht Basis pro Thread. Dies bedeutet, dass in einer Mehrbenutzer Einstellung wie die Apache-Webserver es wird nur mit einem prefork MPM arbeiten (Das heißt ein Prozess pro Benutzer). Arbeiter und andere Gewinde MPM wird nicht funktionieren.
Darüber hinaus sind viele Benutzer GNU steuern gettext von System-Umgebung Variablen wie LANG. Das ist kein gute Lösung für einen Webserver Umwelt aufgrund einer offensichtlichen Rennen Zustand.
Ich hatte dasselbe Problem mit PHP 5.6.30 VC11 Theard sicher auf Windows 10. Abhilfe gefunden und beheben dieses Problem hier von sirio3mil.
Offenbar mit TS PHP kann nur Locale Sprachordner zugreifen. Also, wenn setlocaleQ und putenv Funktion Anruf mit einer anderen Sprache als System ein, einen Ordner mit .mo und .po kann nicht gelesen werden.
Abhilfe ist nur ein Sprachordner mit Systemsprache und mehr Paaren von .mo / .po-Dateien für jeden übersetzten Sprache haben. Domain wird mit gewünschter Sprache eingestellt werden.
Beispiel mit Schweizer Französisch, Deutsch und Italienisch:
Ordnerstruktur
\ Locale \ fr_CH \ LC_MESSAGES
- fr_CH.mo + fr_CH.po // Systemsprache
- de_CH.mo + de_CH.po
- it_CH.mo + it_CH.po
Code
$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);