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

xia*_*oyi 20 php gettext php-gettext

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

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

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

echo gettext('Hello');
Run Code Online (Sandbox Code Playgroud)

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

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

但是,通过更改和新名称的domain参数可以解决此问题.像到.但是每次更新文件时编辑php文件真的很痛苦.bindtextdomain()textdomain()"domain""domain2".mo

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

xia*_*oyi 14

每一个解决方案(1,2,3)建议更改domain摆脱缓存的问题,但是这会在内存中创建大量外的日期缓存.

所以我挖掘了gnu-gettext源代码,了解缓存策略的详细信息(bindtextdom.c:78.)

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

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

cd locale
ln -s . nocache
Run Code Online (Sandbox Code Playgroud)

然后再添加一行 bindtextdomain()

bindtextdomain('domain', './locale/nocache');
bindtextdomain('domain', './locale');
Run Code Online (Sandbox Code Playgroud)

现在缓存每次都被强制刷新.


更新:

在某些情况下这个hack可能不起作用(无法弄清楚确切的条件.)这个解决方案不是你应该在生产环境中使用的东西,而只是那些需要在保持httpd运行的同时修复某些东西的人!

只要你可以,请从一开始就避免使用gettext,这真的很古老,应该被弃用.

  • "只要你可以,请从一开始就避免使用gettext,这真的很古老,应该被弃用." 我为什么要避免它?你能说出一些替代品吗? (18认同)
  • Wordpress使用gettext库来生成其原生的i18n ...我认为它将在很长一段时间内使用. (4认同)
  • @xiaoyi除了gettext之外,你还建议使用什么? (3认同)

Pra*_*n D 14

clearstatcache();在翻译之后调用了函数messages.po,messages.mo并且在没有重启apache的情况下工作正常.加载每个更改我在任何语言文件中所做的.


che*_*ema 5

好的,就我而言,我需要通过执行服务php5.6-fpm-sp restart来重新启动phpfpm。

如果您使用的是php-fpm,则必须重新启动phpfpm才能清除gettext的缓存,但重新启动apache2无效。

希望对别人有用。