PHP Gettext 问题(比如非线程安全?)

发布于 2024-08-09 06:59:45 字数 232 浏览 6 评论 0原文

我想开始使用 gettext 来处理 Web 项目 (PHP 5) 的翻译。由于它是一个广泛使用的标准并享有良好的声誉,因此它似乎是最好的选择。

但是,我也听说服务器不兼容并且它是非线程安全的。这对于我使用它的项目意味着什么?由于我构建了很多人使用的东西,因此我的代码能够正常运行非常重要。

我们谈论的是小问题(例如人们仍在使用 PHP 4)还是主要问题(例如 Web 服务器上 gettext 的分发和安装率较低)?

I want to start using gettext to handle my translations on web projects (PHP 5). Since it is a widely used standard with a good reputation it seems to be the best choice.

However, I'm also hearing things about server incompatibly and it being non-thread-safe. What does this mean for my projects that use it then? Since I build things that many people use, it's very important that my code works.

Are we talking about minor problems (like people still using PHP 4) or major problems like distribution and installation of gettext on websevers being low?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

人│生佛魔见 2024-08-16 06:59:45

线程问题仅适用于使用嵌入式 PHP(例如 Apache 的 mod-php)并运行使用线程的服务器(例如带有worker-mpm 的 Apache 服务器)的情况。

因此,线程安全问题不适用于您,如果:

  1. 您使用 NGINX 服务器(它不使用线程。)
  2. 您使用 Apache(无论是否带有线程 MPM)和 fastcgi 模式下的 PHP
  3. 您使用带有非线程 MPM 的 Apache(作为 prefork-MPM) 和 mod-php 模式下的 PHP。

因此,大多数使用默认 Apache 安装的人不应该担心 gettext 不是线程安全的,因为大多数发行版中的默认 apache 安装都使用非线程 prefork-MPM!

另外,请记住 Windows 上的 Apache 是线程化的。

Threads problem only apply if one uses embedded PHP (Apache's mod-php for example) and runs server that uses threads (like Apache server with worker-mpm).

So - thread safety issue does not apply to you if:

  1. you use NGINX server(it doesn't use threads.)
  2. You use Apache (with either threaded MPM or not) and PHP in fastcgi mode
  3. You use Apache with non-threaded MPM (as prefork-MPM) and PHP in mod-php mode.

So - most people with default Apache install shouldn't worry about gettext not being thread safe, as default apache's install in most distro's uses non-threaded prefork-MPM!

P.S. also - keep in mind that Apache on Windows is threaded.

无风消散 2024-08-16 06:59:45

我认为多玩一些 php 手册注释部分应该会谩骂更多信息.... gettext 部分手册中的注释之一

GNU gettext 库适用于
每个进程,而不是每个线程。
这意味着在多用户
设置,例如 Apache Web 服务器
它只能与 prefork MPM 一起使用
(即每个用户一个进程)。工人
而其他线程 MPM 将无法工作。

此外,许多用户控制着GNU
通过设置系统环境获取文本
LANG 等变量。这不是一个
Web 服务器的好解决方案
由于明显的种族环境
情况。

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

I think play some more with the php manual comments portion should revile more information....one of the comments from the manual on gettext section

The GNU gettext library works on a
per-process, not per-thread basis.
This means that in a multi-user
setting such as the Apache web server
it will only work with a prefork MPM
(i.e. one process per user). Worker
and other threaded MPMs will not work.

In addition, many users control GNU
gettext by setting system environment
variables such as LANG. This is not a
good solution for a web server
environment due to an obvious race
condition.

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

佼人 2024-08-16 06:59:45

我在 Windows 10 上使用 PHP 5.6.30 VC11 Theard Safe 时遇到了同样的问题。找到了解决方法并修复了此问题 此处,作者:sirio3mil。

显然带有 TS 的 PHP 只能访问 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);

I had same problem with PHP 5.6.30 VC11 Theard Safe on Windows 10. Workaround found and fix this issue here by sirio3mil.

Apparently PHP with TS can access only Locale language folder. So when setlocale and putenv function is call with another language than system's one, folder with .mo and .po cannot be read.

Workaround is to have only one language folder with system language and multiple pairs of .mo/.po files for each translated languages. Domain will be set with wanted language.

Example with Swiss French, German and Italian:

Folder structure

\Locale\fr_CH\LC_MESSAGES

  • fr_CH.mo + fr_CH.po // system language
  • de_CH.mo + de_CH.po
  • it_CH.mo + it_CH.po

Code

$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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文