尽管 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_FR
en_GB.UTF-8
fr_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
。