代码之家  ›  专栏  ›  技术社区  ›  prostynick

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

  •  1
  • prostynick  · 技术社区  · 15 年前

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

    我设计了数据库,所以它工作得很好,模式看起来也不错,但是对于每个字典值都有两个连接,所以解决方案并不太快。

    出于这个原因,我考虑只存储一次字典值,并且只在编辑其中的值之后刷新它。不幸的是,不能使用PHP静态变量,因为它们会在请求结束时死亡。我不想使用会话,因为我必须对每个用户进行db调用。理想情况下,我希望使用静态变量,就像Java一样,只要应用程序在JVM中生存,它们就可以生存。

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

    我想做点什么 DictionaryValues 类,将其序列化一次,然后对每个请求进行反序列化。每当有人编辑字典时,对象将再次序列化,并替换旧的序列化对象。当然,与字典值的读取频率相比,编辑很少发生。

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

    也许你能找到更好的解决办法?

    3 回复  |  直到 15 年前
        1
  •  5
  •   jldupont    15 年前

    你可以试试PHP APC . 它速度快,使用方便。您可以对对象进行序列化/反序列化,并轻松地存储/获取它们。

    在分布式环境中,可以使用 memcache .

        2
  •  2
  •   Pekka    15 年前

    如果memcache/apc太多或不可能,请选择以下几个选项:

    您可以经常将数据库值“编译”成一个PHP文件,并将其包含在内。这将是最快的解析和处理方式。

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

        3
  •  1
  •   Greg    15 年前

    有两种选择:

    1. 你可以使用共享内存( shmop memcache )
    2. 您可以缓存到文件或数据库-尝试 PEAR::Cache_Lite (或) APC 正如jldupont建议的那样)