在请求之间记住PHP中的对象状态

时间:2009-11-12 21:40:36

标签: php database session internationalization static-variables

我正在编写一个应用程序,我将使用许多不同语言的字典值。我知道我可以使用GetText,但是AFAIR文件必须在编辑后编译,我想让用户编辑字典,我不能在服务器上重新编译.mo文件。我不知道将使用多少种语言,因此解决方案必须具有弹性。

我设计了数据库,所以它运行良好,架构看起来很好,但是对于每个字典值都有几个连接,所以解决方案不是太快。

因此我想考虑存储一次字典值,并在编辑其中的值后才刷新它。遗憾的是,PHP静态变量无法使用,因为它们在请求结束时死亡。我不想使用会话,因为我将不得不为每个用户进行数据库调用。理想情况下,我想像在Java中一样使用静态变量 - 只要应用程序存在于JVM中,它们就会存在。

对于所有用户(不是每个用户),长时间(不是每个请求)存储一些变量(在我的示例中 - 字典,字典条目等)的最佳解决方案是什么?

我正在考虑制作类似DictionaryValues类的东西,将其序列化一次,然后在每次请求时反序列化它。每当有人编辑字典时,对象将被再次序列化并将替换旧的序列化对象。当然,与读取字典值的频率相比,编辑很少发生。

这是一个很好的解决方案吗?我应该序列化对象并将其存储在磁盘上还是将其写入数据库?哪一个更快?

也许你找到了解决这个问题的更好方法?

3 个答案:

答案 0 :(得分:5)

您可以尝试使用PHP APC。它快速且易于使用。您可以序列化/反序列化对象并轻松存储/获取它们。

在分布式环境中,您可以使用memcache执行相同的功能。

答案 1 :(得分:2)

如果memcache / APC过多或不可能,有几个选项:

您可以将数据库值经常“编译”到PHP文件中并包含它。这将是最快的解析和处理方式。

如果你不需要每个页面中的每个字典值(非常可能,不是吗?)你可能想要使用一个可以在没有JOIN的情况下工作的缓存表。从足迹的角度来看,这将是最好的解决方案。

答案 2 :(得分:1)

有几种选择:

  1. 您可以使用共享内存(shmopmemcache)。
  2. 您可以缓存到文件或数据库 - 尝试PEAR::Cache_Lite(或APC @jldupont建议)