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

时间:2009-12-24 15:35:32

标签: php arrays caching

澄清:

  • 我没有使用gettext php模块 / extension,原因是因为我必须处理没有包含gettext的服务器,我知道php-gettext但是这只是使事情变得复杂,我必须使用多个库。此外,我不想依赖于安装了必要语言环境的用户,以及一些我没有root权限的服务器来执行此操作。我也意识到一般来说语言环境存在很多问题。
  • 必须支持PHP4 。是的,它已经死了。是的,我讨厌它。但我没有选择。

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

之后我有一个解析“应用程序级”.mo文件的方法,并在设置的初始数组中将两者合并在一起,因此应用程序级转换优先于服务器端泛型转换。

由于我正在使用合并数组进行字符串翻译,并且我不想在每个页面上读取.mo文件,因此我需要一些方法来实际缓存它并使用缓存版本 if 正在读取的页面与缓存版本的语言/语言环境相同。

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

基本上,我将如何缓存语言/特定于语言环境的合并数组?我自己从未实际实现过缓存,但我认为我需要做的就是serialize我的数组,然后将其写入应用程序级缓存目录,并将文件名保存为“翻译 - {$ locale}'其中$ locale类似于'en',然后使用逻辑来确定我的应用程序中的语言环境,具体取决于是否有可用的缓存版本 - 如果是,unserialize并使用是什么?

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

array(
  'en' => array(
  'Hello' => '',
),
  'es' => array(
  'Hello' => 'Hola',
)
);

1 个答案:

答案 0 :(得分:1)

我不明白你为什么要缓存多个语言数组?您是否必须为>提供支持?在你的应用程序的单个请求(它的php)中有1种语言吗?

无论如何,你说的很好 - 序列化数组,将其粘贴在缓存中并在将来检索它。如果cache-miss,则重新计算数组。

  

然后将其写入   应用程序级缓存目录,和   将文件名保存为类似的东西   'translation - {$ locale}'其中$ locale   就像'en',然后使用逻辑   确定我的语言环境   应用程序,基于那看看是否有   缓存版本可用。

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