【问题标题】:Should I store my PHP5 Objects in session for SPEED, and why?我应该在会话中存储我的 PHP5 对象以获得 SPEED,为什么?
【发布时间】:2011-05-15 17:02:39
【问题描述】:

如您所知,当您将类定义存储在 SESSION 中时,会自动序列化,并在随后的每个页面中反序列化。

我刚开始写课程,我想知道: 将类存储在会话中或带有序列化的文件中是个好主意吗?

如果是,我如何在 PHP5 中使用 STORE 和 GET 类?

【问题讨论】:

    标签: php class session storage


    【解决方案1】:

    您不能将类存储在会话变量中,但可以存储对象。请注意,如果您的对象具有引用资源(如文件句柄和数据库连接)的属性,那么再多的反序列化也不会将它们带回来。

    【讨论】:

      【解决方案2】:

      除非是小班,否则可能不是 (see this question for possible pitfalls with large sessions)。简而言之,会话并非旨在成为一种缓存机制,当您将它们合二为一时,它们的性能也不会太好。

      请注意,如果您使用默认会话处理程序,您的会话将存储在硬盘上 - 当您收到许多并发请求时速度不会很快。此外(测试和测量),序列化/反序列化可能比创建对象的常规方法慢 - 请注意,您可能会反序列化两次:从会话到字符串,然后将字符串转换为该类的对象。

      如果您想走序列化/反序列化路线,请尝试例如改为 Memcached。

      【讨论】:

        【解决方案3】:

        在会话中存储对象实例有以下缺点:

        • 性能开销:即使您不需要某些对象,也会在每次请求时取消序列化和实例化。
        • 开发中的奇怪错误:每当您从对象中添加或删除属性时,会话中的实例将与对象定义不匹配。
        • 安全性:通常会话数据与您的应用程序分开存储。有时,此位置不像您的其他文件那样受访问保护和安全。
        • 数据重复和错误状态:通过会话,您可以为不同的用户一遍又一遍地存储相同的对象。与每个对象仅存储一次的专用对象缓存相比,这会导致存储需求增加,并且由于状态在另一个会话中发生更改,对象可能会出现错误状态。

        我宁愿将对象存储在专用缓存中。看看 Zend Cache 类作为一个好的缓存库的例子。

        如果您的对象使用资源(数据库连接、文件、gd 图像),您的类应该实现Serializable 接口。然后,您必须添加两个方法来进行清理和初始化。

        【讨论】:

          猜你喜欢
          • 2013-01-10
          • 1970-01-01
          • 1970-01-01
          • 2016-01-07
          • 1970-01-01
          • 2012-01-05
          • 1970-01-01
          • 2021-12-26
          • 1970-01-01
          相关资源
          最近更新 更多