这是来自php manual的一小段代码
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函数来完成这项工作?这样我就可以为这个目的写一个小脚本。
发布于 2012-11-29 23:25:31
每种解决方案(1、2、3)都建议更改domain以消除缓存问题,但这将在内存中创建大量过期缓存。
因此,我深入研究了gnu-gettext源代码,以获取有关缓存策略(bindtextdom.c:78)的详细信息。
当调用bindtextdomain(domain, dirname)时,它将检查缓存中是否存在domain;如果存在,则检查dirname是否与缓存中的相同。如果失败,它将强制刷新相同域的缓存,而不是在内存中创建新的域。
修复方法非常简单,首先创建一个指向存储.mo文件的locale文件夹的虚拟链接:
cd locale
ln -s . nocache然后在bindtextdomain()前添加一行
bindtextdomain('domain', './locale/nocache');
bindtextdomain('domain', './locale');现在,每次都会强制刷新缓存。
更新:
这种攻击在某些情况下可能不起作用(找不出确切的条件)。这个解决方案不应该在生产环境中使用,但只适用于那些需要在保持httpd运行的同时修复某些东西的人!
只要有可能,请避免从一开始就使用gettext,这真的是很古老的东西,应该永远弃用。
发布于 2013-09-23 14:46:57
我在从messages.po转换到messages.mo之后调用了clearstatcache();函数,它在没有重启apache的情况下工作得很好。加载我在任何语言文件中所做的每个更改。
发布于 2015-02-07 21:36:47
好的,在我的例子中,我需要通过执行php5.6-fpm-sp重新启动服务来重新启动phpfpm。
如果你使用的是php-fpm,你必须重新启动phpfpm才能清除gettext的缓存,重启apache2不起作用。
希望对别人是有用的。
https://stackoverflow.com/questions/13625659
复制相似问题