清除 PHP-Apache 服务器的 gettext 缓存以应用 .mo 更新

清除 PHP-Apache 服务器的 gettext 缓存以应用 .mo 更新

尽管 SO 上的许多问题已经与此相关,但它们 A) 相当古老,并且 B) 我觉得最好在这里询问此问题,因为它似乎与某些服务器级别而非编程级别的缓存有关。

问题在于,我们的服务器使用 Apache 和 PHP,gettext在本机配置中使用 .po 和 .mo 文件,即使用bindtextdomain以下文件夹结构:

translations/
    en_GB/
        LC_MESSAGES/
            mydomain.mo
    fr_FR/
        LC_MESSAGES/
            mydomain.mo

例如,为mydomain文本域加载英语和法语翻译。将翻译加载到服务器并首次使用 PHP 的本机gettext()_()等函数,一切正常。问题是,当我们用新翻译更新 .mo 文件时,这些更新不会应用。多个来源指出,必须重新启动 apache 服务器才能刷新 gettext 缓存:

ETC。

到目前为止,是否仍然可以通过重新启动 Apache 服务器来清除 Apache-PHP 应用程序的 gettext 缓存?没有其他方法可以做到这一点吗?假设我们有一个托管的 VPS 主机,因此没有 root 访问权限,并且不允许在我们的服务器上重新启动 Apache。

我知道理论上你可以实现一种逻辑,将修改的时间戳添加到域名中mydomain,但根据这篇文章“更改域名以解决缓存问题 [...] 将在内存中创建大量过时的缓存。”,所以我想知道这种方法是否真的可行。

PHP 在我们的 Apache 服务器上以 php-cgi 形式运行。我现在还注意到LC_MESSAGES文件夹中包含一个.nfs....我似乎无法删除的文件(如果我删除它,它只会重新出现)。这是否表明我的.mo文件已被某个应用程序重新打开/访问,而不是关闭,从而导致某种不需要的翻译缓存?

答案1

我在多个地方读到过,如果 PHP 不是作为 Apache 模块在您的服务器上运行(在我的示例中,PHP 以 FastCGI 形式运行),则此 gettext 缓存不应该是一个大问题。事实上,问题实际上是另一个:

  • 通过 列出我的 Apache 服务器上所有可用的区域设置后locale -a,我发现所有可用区域设置的名称都包含编码。因此,区域设置不是例如en_GB和,而是和。fr_FRen_GB.UTF-8fr_FR.UTF-8
  • 因此,我修改了上述文件夹:
translations/
    en_GB/
        LC_MESSAGES/
            mydomain.mo
    fr_FR/
        LC_MESSAGES/
            mydomain.mo

对于这些:

translations/
    en_GB.UTF-8/
        LC_MESSAGES/
            mydomain.mo
    fr_FR.UTF-8/
        LC_MESSAGES/
            mydomain.mo

然后,每次我更新文件内容时.mo,我只需通过 ssh 登录并运行:

killall -9 php-cgi

新的翻译已正确加载。请注意,执行此操作不需要 Apache Restart 或 root 访问权限。但请注意,命令:

killall -9 php-cgi

在我将编码包含在语言环境文件夹名称中之前没有任何效果;因此看起来语言环境文件夹名称(以及在 PHP 中加载文本域时指定的语言环境)必须与服务器上的语言环境名称采用相同的格式,通过 获得locale -a

相关内容