Проблемы PHP Gettext (например, непотокобезопасность?)
-
22-07-2019 - |
Вопрос
Я хочу начать использовать gettext для обработки моих переводов в веб-проектах (PHP 5).Поскольку это широко используемый стандарт с хорошей репутацией, он кажется лучшим выбором.
Тем не менее, я также слышу что-то о несовместимости сервера и о том, что он не является потокобезопасным.Что это значит для моих проектов, которые его используют?Поскольку я создаю вещи, которые используют многие люди, очень важно, чтобы мой код работал.
Говорим ли мы о незначительных проблемах (например, о людях, все еще использующих PHP 4) или о серьезных проблемах, таких как низкий уровень распространения и установки gettext на веб-серверах?
Решение
Проблема с потоками возникает только в том случае, если кто-то использует встроенный PHP (например, mod-php Apache) и запускает сервер, который использует потоки (например, сервер Apache с worker-mpm).
Итак, проблема безопасности потоков к вам не относится, если:
- вы используете сервер NGINX (он не использует потоки).
- Вы используете Apache (с многопоточным MPM или нет) и PHP в режиме fastcgi.
- Вы используете Apache с безпоточным MPM (как prefork-MPM) и PHP в режиме mod-php.
Итак, большинству людей с установкой Apache по умолчанию не следует беспокоиться о том, что gettext не является потокобезопасным, поскольку установка Apache по умолчанию в большинстве дистрибутивов использует безпоточный prefork-MPM!
P.S.также - имейте в виду, что Apache в Windows является многопоточным.
Другие советы
Я думаю, что поиграйте с частью комментариев к php вручную, вы должны получить больше информации ... один из комментариев из руководства в разделе gettext
Библиотека gettext GNU работает на для каждого процесса, а не для каждого потока. Это означает, что в многопользовательском настройки, такие как веб-сервер Apache он будет работать только с префорком MPM (то есть один процесс на пользователя). работник и другие резьбовые MPM не будут работать.
Кроме того, многие пользователи контролируют GNU получить текст, установив системную среду переменные, такие как LANG. Это не хорошее решение для веб-сервера среда из-за явной гонки состояние.
У меня была такая же проблема с PHP 5.6.30 VC11 Theard Safe в Windows 10.Обходной путь найден и устраните эту проблему здесь от sirio3mil.
Очевидно, PHP с TS может получить доступ только к папке языка Locale.Поэтому, когда функции setlocale и putenv вызываются на языке, отличном от системного, папка с .mo и .po не может быть прочитана.
Обходной путь — иметь только одну языковую папку с системным языком и несколько пар файлов .mo/.po для каждого переведенного языка.В домене будет установлен желаемый язык.
Пример со швейцарским французским, немецким и итальянским:
Структура папок
\Локаль\fr_CH\LC_MESSAGES
- fr_CH.mo + fr_CH.po // системный язык
- de_CH.mo + de_CH.po
- it_CH.mo + it_CH.po
Код
$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);