2010-11-25 49 views
3

如您所知,当您在SESSION中自动序列化存储类定义时,并且在每个后续页面上都将反序列化。我应该在SPEED会话中存储我的PHP5对象,为什么?

我刚开始写类,我想知道: 要存储一个类在会话或文件与序列化是一个好主意?

如果是的话,我该如何储存,然后GET使用PHP5中的班级?

回答

1

存储对象实例有以下缺点:

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

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

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

2

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

2

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

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

如果您想要进行序列化/反序列化路由,请尝试改为Memcached。在会议

相关问题