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

StackOverflow https://stackoverflow.com/questions/1646249

Вопрос

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

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

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

Это было полезно?

Решение

Проблема с потоками возникает только в том случае, если кто-то использует встроенный 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 является многопоточным.

Другие советы

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

  

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

     

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

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

У меня была такая же проблема с 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top