如何在不重新启动Apache或更改域的情况下清除php的gettext缓存?

2022-08-30 17:44:23

这是php手册中的一个小代码片段:

putenv('LC_ALL=zh_CN');
setlocale(LC_ALL, 'zh_CN');

bindtextdomain('domain', './locale');
textdomain('domain');

echo gettext('Hello');

这将输出你好,如文件中定义,但问题是只要Apache正在运行,总是返回缓存的结果。domain.mogettext()

如果我在 中将 Hello 的翻译更改为您好,它仍然会输出你好domain.mo

但是,可以通过将 和 的参数更改为新名称来解决此问题。喜欢 从 到 .但是每次我更新文件时编辑php文件真的很痛苦。domainbindtextdomain()textdomain()"domain""domain2".mo

有没有更好的方法来做到这一点,比如删除一些文件夹或调用一些php函数来完成这项工作?这样我就可以为此写一个小脚本。


答案 1

每个解决方案(123)都建议更改以摆脱缓存问题,但这会在内存中创建大量过时的缓存。domain

因此,我深入研究了 gnu-gettext 源代码,以获取有关缓存策略的详细信息 (bindtextdom.c:78)。

当被调用时,它将检查缓存中是否存在;如果是这样,它将检查是否与缓存中的那个相同。如果此操作失败,它将强制对同一域进行缓存刷新,而不是在内存中创建新域。bindtextdomain(domain, dirname)domaindirname

修复非常简单,首先创建一个虚拟链接,指向存储文件的文件夹:locale.mo

cd locale
ln -s . nocache

然后在前面添加一行bindtextdomain()

bindtextdomain('domain', './locale/nocache');
bindtextdomain('domain', './locale');

现在,每次都强制刷新缓存。


更新:

在某些情况下,此黑客可能不起作用(无法弄清楚确切的条件。此解决方案不是您应该在生产环境中使用的解决方案,而仅适用于那些需要在保持httpd运行的同时修复某些内容的人!

只要有可能,请避免从一开始就使用gettext,这真的是古老的东西,应该被永久弃用。


答案 2

我在从到转换后调用函数,它无需重新启动apache即可正常工作。加载我在任何语言文件中所做的每个更改。clearstatcache();messages.pomessages.mo


推荐