AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1134254
Accepted
DevelJoe
DevelJoe
Asked: 2023-06-19 21:01:19 +0800 CST2023-06-19 21:01:19 +0800 CST 2023-06-19 21:01:19 +0800 CST

清除 PHP-Apache 服务器的 gettext 缓存以应用 .mo 更新

  • 772

虽然SO上的许多问题已经与此相关,但它们A)相当老了,B)我觉得最好在这里问这个问题,因为它似乎与某些服务器级别而不是编程级别的缓存有关。

问题是我们的服务器使用 Apache 和 PHP,gettext在本机配置中使用 .po 和 .mo 文件,即使用bindtextdomain文件夹结构:

translations/
    en_GB/
        LC_MESSAGES/
            mydomain.mo
    fr_FR/
        LC_MESSAGES/
            mydomain.mo

例如,加载mydomain文本域的英语和法语翻译。将翻译加载到服务器并首次使用 PHP 的本机gettext()、_()等功能可以正常工作,一切都很好。问题是,当我们用新翻译更新 .mo 文件时,这些更新不会应用。多个消息来源指出,必须重新启动 apache 服务器才能刷新 gettext 缓存:

  • 所以
  • GNU
  • 语言中心

ETC。

到目前为止,Apache-PHP 应用程序的 gettext 缓存是否仍然可以通过重新启动 apache 服务器来完全刷新?没有其他方法可以做到这一点吗?考虑到我们有一个托管的 VPS 托管,因此没有 root 访问权限,并且我们不允许在我们的服务器上重新启动 Apache。

我知道理论上您可以实现一个逻辑,将修改的时间戳添加到域名中mydomain,但根据此处的这篇文章,“更改域以消除缓存问题[...]将创建大量的out-of -内存中的日期缓存。”,所以我想知道这种方法是否真的可行。

PHP 在我们的 Apache 服务器上作为 php-cgi 运行。我现在还注意到,这些LC_MESSAGES文件夹包含一个.nfs....我似乎无法删除的文件(如果我删除它,它就会重新出现)。这是否表明我的.mo文件已被某些应用程序重新打开/访问,而不是关闭,从而导致某种不需要的翻译缓存?

apache-2.2
  • 1 1 个回答
  • 29 Views

1 个回答

  • Voted
  1. Best Answer
    DevelJoe
    2023-06-21T19:19:08+08:002023-06-21T19:19:08+08:00

    我在多个地方读到,如果 PHP 没有作为 Apache 模块在您的服务器上运行(在我的示例中,PHP 作为 FastCGI 运行),那么这个 gettext 缓存应该不会是一个大问题。事实上,问题实际上是一个不同的问题:

    • 通过 列出我的 Apache 服务器上的所有可用语言环境后locale -a,我必须看到可用语言环境的名称都包含其名称中的编码。因此,区域设置不是 例如en_GB和,而是和。fr_FRen_GB.UTF-8fr_FR.UTF-8
    • 因此,我对上述文件夹进行了调整:
    translations/
        en_GB/
            LC_MESSAGES/
                mydomain.mo
        fr_FR/
            LC_MESSAGES/
                mydomain.mo
    

    对于这些:

    translations/
        en_GB.UTF-8/
            LC_MESSAGES/
                mydomain.mo
        fr_FR.UTF-8/
            LC_MESSAGES/
                mydomain.mo
    

    然后,每次更新文件内容时.mo,我只需通过 ssh 登录并运行:

    killall -9 php-cgi

    新的翻译已正确加载。请注意,执行此操作不需要重新启动 Apache,也不需要 root 访问权限。但请注意该命令:

    killall -9 php-cgi

    在我将编码包含在语言环境文件夹名称中之前没有任何效果;因此,语言环境文件夹名称(以及您在 PHP 中加载文本域时指定的语言环境)必须与服务器上的语言环境名称采用相同的形式,通过locale -a.

    • 0

相关问题

  • Apache Django Mod_Wsgi - 自动重新加载应用程序

  • Apache:对多个虚拟主机使用相同的目录指令

  • Apache 上的子域不工作 - 找不到服务器

  • PHP 作为 CGI 还是 Apache 模块?

  • 避免将某些丢失的文件记录到 Apache2 错误日志中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve