代码之家  ›  专栏  ›  技术社区  ›  meder omuraliev

合并的mo文件的缓存策略,哪些文件成为数组?

  •  0
  • meder omuraliev  · 技术社区  · 15 年前

    澄清:

    • 我没有使用GetText PHP模块 /扩展,原因是我必须处理没有包含gettext的服务器,我知道php gettext,但这会使我不得不使用多个库的事情变得复杂。此外,我不想依赖于安装了必要区域设置的用户,以及一些我没有根访问权限的服务器。我还认识到,一般来说,地区存在很多问题。
    • 必须支持php4 . 是的,它死了。是的,我讨厌它。但我别无选择。

    我有一个类解析“服务器级别” .mo 基于当前语言的getText文件(默认为en),遍历每个msgid和msgstr,并用msgid和msgstr的键/值填充数组。

    然后我有了一个方法来解析“应用程序级别” 在所设置的初始数组中,文件和合并这两者,因此应用程序级转换优先于服务器端通用转换。

    因为我使用合并数组进行字符串转换,而且我不想在每次读取一页时都读取.mo文件,所以我需要某种方法来实际缓存该文件并使用缓存的版本。 如果 正在读取的页面的语言/区域设置与缓存版本相同。

    因此,如果我访问我的网站,默认语言是英语,它将读取英语服务器/应用程序mo文件,合并它们,生成数组,缓存它。如果用户单击的下一页是英语,则将使用缓存版本。否则,如果说西班牙语,则再次进行合并,并使用西班牙语缓存版本。

    所以,基本上,我该如何缓存特定于语言/区域设置的合并数组呢?我从未真正实现过缓存,但我想我需要做的就是 serialize 我的数组,然后将其写入应用程序级缓存目录,并将文件名保存为“translation-$locale”,其中$locale类似于“en”,然后使用逻辑确定应用程序中的区域设置,在此基础上查看是否有可用的缓存版本-如果有, unserialize 就用这个?

    这通常是怎么做的吗?我非常感谢代码示例。我拥有的数组大约有200-300个键/值对,只是一个两级多维数组:

    array(
      'en' => array(
      'Hello' => '',
    ),
      'es' => array(
      'Hello' => 'Hola',
    )
    );
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   mr-sk    15 年前

    我不明白为什么要缓存多个语言数组?在应用程序的单个请求(其PHP)期间,是否必须提供对>1语言的支持?

    不管怎样,你所说的是好的——序列化数组,将它保存在缓存中,并在将来检索它。如果缓存未命中,请重新计算数组。

    然后把它写进 应用程序级缓存目录,以及 将文件名保存为 '翻译-$locale'其中$locale 是“en”之类的,然后使用逻辑 确定我的区域设置 应用程序,基于此查看是否有 缓存版本可用。

    文件I/O的速度不如内存访问快-如果您遇到缓存问题,我建议您查看memcache。