首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何清除php的gettext缓存而无需重启Apache或更改域?

如何清除php的gettext缓存而无需重启Apache或更改域?
EN

Stack Overflow用户
提问于 2012-11-29 20:17:01
回答 6查看 19.7K关注 0票数 23

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

代码语言:javascript
运行
复制
putenv('LC_ALL=zh_CN');
setlocale(LC_ALL, 'zh_CN');

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

echo gettext('Hello');

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

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

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

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-11-29 23:25:31

每种解决方案(123)都建议更改domain以消除缓存问题,但这将在内存中创建大量过期缓存。

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

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

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

代码语言:javascript
运行
复制
cd locale
ln -s . nocache

然后在bindtextdomain()前添加一行

代码语言:javascript
运行
复制
bindtextdomain('domain', './locale/nocache');
bindtextdomain('domain', './locale');

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

更新:

这种攻击在某些情况下可能不起作用(找不出确切的条件)。这个解决方案不应该在生产环境中使用,但只适用于那些需要在保持httpd运行的同时修复某些东西的人!

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

票数 17
EN

Stack Overflow用户

发布于 2013-09-23 14:46:57

我在从messages.po转换到messages.mo之后调用了clearstatcache();函数,它在没有重启apache的情况下工作得很好。加载我在任何语言文件中所做的每个更改。

票数 14
EN

Stack Overflow用户

发布于 2015-02-07 21:36:47

好的,在我的例子中,我需要通过执行php5.6-fpm-sp重新启动服务来重新启动phpfpm。

如果你使用的是php-fpm,你必须重新启动phpfpm才能清除gettext的缓存,重启apache2不起作用。

希望对别人是有用的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13625659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档