Проблемы с PHP Gettext (например, не потокобезопасны?) - PullRequest
10 голосов
/ 29 октября 2009

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

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

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

Ответы [ 3 ]

15 голосов
/ 18 июля 2011

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

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

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

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

P.S. также имейте в виду, что Apache для Windows является многопоточным.

2 голосов
/ 29 октября 2009

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

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

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

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

0 голосов
/ 10 февраля 2017

У меня была та же проблема с PHP 5.6.30 VC11 Theard Safe в Windows 10. Обходной путь найден и исправлен этот вопрос здесь от sirio3mil.

Очевидно, что PHP с TS может получить доступ только к языковой папке Locale. Поэтому, когда функции 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);
...