如何清除而不重新启动Apache,也没有改变域名PHP的gettext的缓存?(How to cle

2019-07-04 06:45发布

这是从一个小的代码片段PHP手册 :

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

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

echo gettext('Hello');

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

如果我改变你好的翻译您好domain.mo ,它仍将输出你好

然而,有通过改变此修复程序domain的参数bindtextdomain()textdomain()到一个新的名字。 就像从"domain""domain2" 。 但是,这是真的很痛苦我每次更新的时间来编辑PHP文件.mo文件。

是否有这样做的,像删除一些文件夹,或调用一些PHP函数来完成这项工作更好的办法? 所以,我可以写用于此目的的小脚本。

Answer 1:

我叫clearstatcache(); 从折算后的功能messages.pomessages.mo及其而不需要重新启动Apache的正常工作。 每个加载改变我的任何语言文件想提出。



Answer 2:

每一个解决方案( 1 , 2 , 3 )建议更改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');

现在,高速缓存被强制每次刷新。


更新:

这个技巧可能不工作在某些情况下(想不通的确切条件)。该解决方案是不是你应该在生产环境中使用,但仅限于那些谁需要修复的东西,同时保持httpd的运行!

每当你可以,请避免使用gettext的从一开始,这真的是古代的东西,应该弃用为好。



Answer 3:

好吧,在我的情况,我需要做的服务php5.6-FPM-SP重启重启phpfpm。

如果你正在使用phpfpm必须重新启动,以明确的gettext的缓存phpfpm,重新启动的Apache2不起作用。

希望能对别人有用。



Answer 4:

对我来说,解决办法是将文件保存使用不同的名称,例如使用日期,然后更改域:

#the path for a domain, the .mo files must match the domain
#the trick to avoid permanent caching, is to use different names for the domain,             like the date messages_180320151250
$domain = 'messages_180320151300';

#sets the path for a domain, the .mo files must match the domain
bindtextdomain($domain, $_SERVER['DOCUMENT_ROOT']."/apps/cp/locale");

textdomain($domain);


Answer 5:

有恕我直言没有直接的方法来做到这一点(除了域变通方法,您已经提到),这就是为什么我们使用PHP-gettext的 。

更新:这一点我们已经开始为保持motranslator ,由作曲家安装,并与所有的PHP版本兼容。



Answer 6:

使用apachectl graceful命令问进程重新读取配置。 AFTER要求完成服务将终止请求。 所以它看起来是安全的。

根据Apache HTTP服务器2.2文档

该USR1或优雅信号使得父进程的当前请求后,给孩子退出建议(或者,如果他们没有任何服务立即退出)。 父进程重新读取它的配置文件,并重新打开它的日志文件。 由于每个儿童死于关父与新一代的配置,这将立即开始提供服务的新要求孩子来替换它。

它为我工作。



文章来源: How to clear php's gettext cache without restart Apache nor change domain?