gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:57:38 24 4
gpt4 key购买 nike

这是来自 php manual 的一小段代码:

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

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

echo gettext('Hello');

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

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

不过,通过将 bindtextdomain()textdomain()domain 参数更改为新名称,可以解决此问题。比如从 "domain""domain2"。但是每次更新.mo文件都要编辑php文件真的很痛苦。

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

最佳答案

每个解决方案(123)都建议更改 domain 以解决缓存问题,但这会在内存。

所以我挖掘了 gnu-gettext 源以获取有关缓存策略的详细信息 (bindtextdom.c:78.)

调用bindtextdomain(domain, dirname)时,会检查缓存中是否存在domain;如果是这样,它将检查 dirname 是否与缓存中的相同。如果这失败了,它将强制刷新同一域的缓存,而不是在内存中创建一个新的。

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

cd locale
ln -s . nocache

然后在bindtextdomain()

前加一行
bindtextdomain('domain', './locale/nocache');
bindtextdomain('domain', './locale');

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


更新:

此 hack 在某些情况下可能不起作用(无法确定确切的条件。)此解决方案您应该在生产环境中使用,但仅适用于需要修复某些问题的人同时保持httpd运行!

请尽可能从一开始就避免使用 gettext,这确实是古老的东西,应该永远弃用。

关于php - 如何在不重启 Apache 或更改域的情况下清除 php 的 gettext 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13625659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com