Проблемы с PHP Gettext (например, без потоковой безопасности?)

Я хочу начать использовать gettext для обработки моих переводов на веб-проектах (PHP 5). Поскольку он является широко используемым стандартом с хорошей репутацией, он кажется лучшим выбором.

Тем не менее, я также слышу о несовместимости сервера, и он не является потокобезопасным. Что это значит для моих проектов, которые используют его тогда? Поскольку я строю вещи, которые используют многие люди, очень важно, чтобы мой код работал.

Мы говорим о незначительных проблемах (например, о людях, которые все еще используют PHP 4), или о серьезных проблемах, таких как распространение и установка gettext на веб-страницах, которые являются низкими?

Related of "Проблемы с PHP Gettext (например, без потоковой безопасности?)"

Проблема потоков применяется только в том случае, если вы используете встроенный PHP (например, mod-php от Apache) и запускаете сервер, который использует потоки (например, сервер Apache с рабочим-mpm).

Таким образом, проблема безопасности потоков не распространяется на вас, если:

  1. вы используете сервер NGINX (он не использует потоки).
  2. Вы используете Apache (с многопоточным MPM или нет) и PHP в режиме fastcgi
  3. Вы используете Apache с non-threaded MPM (как prefork-MPM) и PHP в режиме mod-php.

Таким образом, большинство пользователей с установкой Apache по умолчанию не должны беспокоиться о том, что gettext не является потокобезопасным, поскольку установка по умолчанию apache в большинстве дистрибутивов использует не-threaded prefork-MPM!

PS также – имейте в виду, что Apache на Windows имеет резьбу.

Я думаю, что сыграть еще немного с частью комментариев с комментариями php, должно понести больше информации … один из комментариев руководства по разделу gettext

Библиотека GNU gettext работает для каждого процесса, а не для каждого потока. Это означает, что в многопользовательских настройках, таких как веб-сервер Apache, он будет работать только с предпродажным MPM (т.е. одним процессом для каждого пользователя). Рабочий и другие многопоточные MPM не будут работать.

Кроме того, многие пользователи контролируют GNU gettext, устанавливая переменные системной среды, такие как LANG. Это нехорошее решение для среды веб-сервера из-за очевидного состояния гонки.

http://www.php.net/manual/en/gettext.setup.php

У меня была такая же проблема с 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);