虽然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-PHP 应用程序的 gettext 缓存是否仍然可以通过重新启动 apache 服务器来完全刷新?没有其他方法可以做到这一点吗?考虑到我们有一个托管的 VPS 托管,因此没有 root 访问权限,并且我们不允许在我们的服务器上重新启动 Apache。
我知道理论上您可以实现一个逻辑,将修改的时间戳添加到域名中mydomain
,但根据此处的这篇文章,“更改域以消除缓存问题[...]将创建大量的out-of -内存中的日期缓存。”,所以我想知道这种方法是否真的可行。
PHP 在我们的 Apache 服务器上作为 php-cgi 运行。我现在还注意到,这些LC_MESSAGES
文件夹包含一个.nfs....
我似乎无法删除的文件(如果我删除它,它就会重新出现)。这是否表明我的.mo
文件已被某些应用程序重新打开/访问,而不是关闭,从而导致某种不需要的翻译缓存?
我在多个地方读到,如果 PHP 没有作为 Apache 模块在您的服务器上运行(在我的示例中,PHP 作为 FastCGI 运行),那么这个 gettext 缓存应该不会是一个大问题。事实上,问题实际上是一个不同的问题:
locale -a
,我必须看到可用语言环境的名称都包含其名称中的编码。因此,区域设置不是 例如en_GB
和,而是和。fr_FR
en_GB.UTF-8
fr_FR.UTF-8
对于这些:
然后,每次更新文件内容时
.mo
,我只需通过 ssh 登录并运行:killall -9 php-cgi
新的翻译已正确加载。请注意,执行此操作不需要重新启动 Apache,也不需要 root 访问权限。但请注意该命令:
killall -9 php-cgi
在我将编码包含在语言环境文件夹名称中之前没有任何效果;因此,语言环境文件夹名称(以及您在 PHP 中加载文本域时指定的语言环境)必须与服务器上的语言环境名称采用相同的形式,通过
locale -a
.