PHP Gettext 问题(比如非线程安全?)
-
22-07-2019 - |
题
我想开始使用 gettext 来处理 Web 项目 (PHP 5) 的翻译。由于它是一个广泛使用的标准并享有良好的声誉,因此它似乎是最好的选择。
但是,我也听说服务器不兼容并且它是非线程安全的。这对于我使用它的项目意味着什么?由于我构建了很多人使用的东西,因此我的代码能够正常运行非常重要。
我们谈论的是小问题(例如人们仍在使用 PHP 4)还是主要问题(例如 Web 服务器上 gettext 的分发和安装率较低)?
解决方案
线程问题仅适用于使用嵌入式 PHP(例如 Apache 的 mod-php)并运行使用线程的服务器(例如带有worker-mpm 的 Apache 服务器)的情况。
因此,如果出现以下情况,线程安全问题不适用于您:
- 你使用 NGINX 服务器(它不使用线程。)
- 您在 fastcgi 模式下使用 Apache(带线程 MPM 或不带线程 MPM)和 PHP
- 您可以将 Apache 与非线程 MPM(如 prefork-MPM)一起使用,并在 mod-php 模式下使用 PHP。
因此,大多数使用默认 Apache 安装的人不应该担心 gettext 不是线程安全的,因为大多数发行版中的默认 apache 安装都使用非线程 prefork-MPM!
附:另外 - 请记住 Windows 上的 Apache 是线程化的。
其他提示
我想打多用PHP手册注释部分应一些辱骂的更多信息....从gettext的部分手动
的注释中的一个在GNU gettext库上的作品 每个进程,而不是每个线程的基础。 这意味着,在一个多用户 设置如Apache Web服务器 它只会用prefork的MPM的工作 (每个用户即,一个处理)。工人 和另一个螺纹的MPM将不起作用。
此外,许多用户控制GNU 通过设置系统环境的getText 变量,如LANG。这不是一个 一个Web服务器很好的解决方案 环境因明显的种族 条件。
我在 Windows 10 上使用 PHP 5.6.30 VC11 Theard Safe 时遇到了同样的问题。找到解决方法并修复此问题 这里 作者:sirio3mil。
显然带有 TS 的 PHP 只能访问 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);