【发布时间】:2011-05-15 17:02:39
【问题描述】:
如您所知,当您将类定义存储在 SESSION 中时,会自动序列化,并在随后的每个页面中反序列化。
我刚开始写课程,我想知道: 将类存储在会话中或带有序列化的文件中是个好主意吗?
如果是,我如何在 PHP5 中使用 STORE 和 GET 类?
【问题讨论】:
如您所知,当您将类定义存储在 SESSION 中时,会自动序列化,并在随后的每个页面中反序列化。
我刚开始写课程,我想知道: 将类存储在会话中或带有序列化的文件中是个好主意吗?
如果是,我如何在 PHP5 中使用 STORE 和 GET 类?
【问题讨论】:
您不能将类存储在会话变量中,但可以存储对象。请注意,如果您的对象具有引用资源(如文件句柄和数据库连接)的属性,那么再多的反序列化也不会将它们带回来。
【讨论】:
除非是小班,否则可能不是 (see this question for possible pitfalls with large sessions)。简而言之,会话并非旨在成为一种缓存机制,当您将它们合二为一时,它们的性能也不会太好。
请注意,如果您使用默认会话处理程序,您的会话将存储在硬盘上 - 当您收到许多并发请求时速度不会很快。此外(测试和测量),序列化/反序列化可能比创建对象的常规方法慢 - 请注意,您可能会反序列化两次:从会话到字符串,然后将字符串转换为该类的对象。
如果您想走序列化/反序列化路线,请尝试例如改为 Memcached。
【讨论】:
在会话中存储对象实例有以下缺点:
我宁愿将对象存储在专用缓存中。看看 Zend Cache 类作为一个好的缓存库的例子。
如果您的对象使用资源(数据库连接、文件、gd 图像),您的类应该实现Serializable 接口。然后,您必须添加两个方法来进行清理和初始化。
【讨论】: