我应该将我的PHP5对象存储在SPEED会话中,为什么?

时间:2010-11-25 13:06:08

标签: php class session storage

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

我刚开始写课,我想知道: 在会话中存储类或使用序列化存储文​​件是个好主意吗?

如果是,我如何存储然后获取使用 PHP5 中的类?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

除非它是一个小班,可能不是(see this question for possible pitfalls with large sessions)。简而言之,会话不是设计为缓存机制,当它们合并为一个时,它们的表现不会很好。

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

如果您想要进行序列化/反序列化路由,请尝试例如Memcached而不是。

答案 2 :(得分:1)

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

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

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

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