Проблемы с 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);