Проблемы с PHP Gettext (например, без потоковой безопасности?)
Я хочу начать использовать gettext для обработки моих переводов на веб-проектах (PHP 5). Поскольку это широко используемый стандарт с хорошей репутацией, это, пожалуй, лучший выбор.
Тем не менее, я также слышу о несовместимости сервера и не являюсь потокобезопасным. Что это значит для моих проектов, которые используют его тогда? Поскольку я строю вещи, которые используют многие люди, очень важно, чтобы мой код работал.
Мы говорим о незначительных проблемах (например, о людях, которые все еще используют PHP 4), или о серьезных проблемах, таких как распространение и установка gettext на веб-страницах, которые являются низкими?
Ответы
Ответ 1
Проблема потоков применяется только в том случае, если вы используете встроенный PHP (например, Apache mod-php) и запускаете сервер, который использует потоки (например, Apache-сервер с рабочим-mpm).
Так что проблема безопасности нитей не относится к вам, если:
- вы используете NGINX-сервер (он не использует потоки.)
- Вы используете Apache (с MPM с потоковой передачей или без него) и PHP в режиме fastcgi.
- Вы используете Apache с non-threaded MPM (как prefork-MPM) и PHP в режиме mod-php.
Итак, большинство пользователей с установкой Apache по умолчанию не должны беспокоиться о том, что gettext не является потокобезопасным, поскольку по умолчанию установка apache в большинстве дистрибутивов использует не-threaded prefork-MPM!
P.S. также - имейте в виду, что Apache в Windows имеет резьбу.
Ответ 2
Я думаю, что сыграть еще немного с частью комментариев с комментариями php, должно понести дополнительную информацию.... один из комментариев руководства по секции gettext
Библиотека gettext GNU работает на для каждого процесса, а не для каждого потока. Это означает, что в многопользовательском режиме таких как веб-сервер Apache он будет работать только с предварительным MPM (то есть одного процесса на пользователя). работник и другие многопоточные MPM не будут работать.
Кроме того, многие пользователи контролируют GNU gettext, установив системную среду переменные, такие как LANG. Это не хорошее решение для веб-сервера окружающей среды из-за очевидной расы состояние.
http://www.php.net/manual/en/gettext.setup.php
Ответ 3
У меня была такая же проблема с PHP 5.6.30 VC11 Theard Safe в Windows 10. Обходной путь нашел и устранил эту проблему здесь от sirio3mil.
Очевидно, что PHP с TS может обращаться только к языковой папке языка. Поэтому, когда функция setlocale и putenv является вызовом с другим языком, кроме системного, папка с .mo и .po не может быть прочитана.
Обходной путь состоит в том, чтобы иметь только одну языковую папку с системным языком и несколько пар файлов .mo/.po для каждого переведенного языка. Домен будет установлен с нужным языком.
Пример со швейцарским французским, немецким и итальянским:
Структура папки
\ Locale\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);