代码之家  ›  专栏  ›  技术社区  ›  Xeoncross

php gettext问题(比如非线程安全?)

  •  10
  • Xeoncross  · 技术社区  · 15 年前

    我想开始使用gettext来处理我在Web项目(php 5)上的翻译。由于这是一个广泛使用的标准和良好的声誉,它似乎是最好的选择。

    然而,我也听到了一些关于服务器不兼容和非线程安全的事情。这对我使用它的项目意味着什么?因为我构建了许多人使用的东西,所以我的代码很重要。

    我们是在讨论一些小问题(比如人们仍然在使用PHP4)还是在讨论一些大问题,比如在WebEver上分布和安装getText的速度很低?

    3 回复  |  直到 8 年前
        1
  •  15
  •   ThatGuy    13 年前

    线程问题只适用于使用嵌入式PHP(例如,Apache的mod php)并运行使用线程的服务器(如带Worker MPM的Apache服务器)的情况。

    所以-线程安全问题不适用于您,如果:

    1. 您使用nginx服务器(它不使用线程)。
    2. 在fastcgi模式下,可以使用apache(带线程的mpm或不带线程的mpm)和php。
    3. 在mod-php模式下,使用apache和非线程mpm(作为预处理mpm)以及php。

    所以-大多数使用默认apache安装的人不应该担心gettext不是线程安全的,因为在大多数发行版中,默认apache的安装都使用非线程的预处理mpm!

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

        2
  •  2
  •   Ronald Conco    15 年前

    我想用php手册注释部分再多加一些,应该可以修改更多信息….gettext部分手册中的注释之一

    GNU GetText库在 每个进程,而不是每个线程。 这意味着在多用户中 设置,如Apache Web服务器 它只能和一个工作前的MPM一起工作 (即每个用户一个进程)。工人 其他线程的MPM也不能工作。

    此外,许多用户控制GNU 通过设置系统环境获取文本 变量,如lang。这不是 Web服务器的好解决方案 明显种族的环境 条件。

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

        3
  •  0
  •   Camille    8 年前

    我对Windows10上的PHP5.6.30 VC11 Theard Safe也有同样的问题。找到解决方法并解决此问题 here 通过siRiO3MIL。

    显然,带有TS的PHP只能访问区域语言文件夹。因此,当setlocale和putenv函数使用其他语言而不是系统语言调用时,将无法读取带有.mo和.po的文件夹。

    解决方法是,对于每种翻译语言,只有一个带有系统语言的语言文件夹和多对.mo/.po文件。域将被设置为所需的语言。

    瑞士法语、德语和意大利语示例:

    文件夹结构

    \区域设置\fR\ch\lc\u消息

    • fr_ch.mo+fr_ch.po//系统语言
    • 德鲁Ch.mo+德鲁Ch.po
    • IT频道+IT频道

    代码

    $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);