通过将PHP对象存储在会话变量中来保持PHP对象的活动是否常见?

时间:2011-06-15 00:44:58

标签: php

我是使用PHP的OOP的新手,这个想法在某些方面似乎有点无意义。在非基于Web的语言中,对象贯穿整个程序的生命周期(从执行到退出)。在这种情况下,它非常有意义,因为您构建了类,然后在运行时对其进行初始化,您可以根据需要经常访问它。然而,由于应用程序的执行可能在许多阶段(页面加载)中发生,因此对于Web编程而言,对象的生命周期可能最终只是应用程序运行时的一小部分。所以在我看来,在应用程序使用过程中保持对象存活的唯一选择是在会话变量初始化之后存储该对象。这是常见做法还是有其他方法可以更有效地利用PHP中的OOP功能?

4 个答案:

答案 0 :(得分:8)

PHP的网站上有一篇专门讨论这个问题的文章:Serializing objects - objects in sessions。在会话中序列化对象绝对没有错,但正如本文建议的那样:

  

强烈建议如果是   应用程序序列化对象,用于   在应用程序的后期使用,即   申请包括班级   始终定义该对象   应用程序。不这样做可能   导致对象被反序列化   没有班级定义......

答案 1 :(得分:2)

管理具有短时间限制寿命的对象仍然非常有用。也许您想要与两种不同类型的数据库服务器进行通信 - 拥有知道如何为这些数据库服务器构建查询的对象可以非常方便。程序员可以以相同的方式与它们进行交互,但是在幕后,可以使用unix域套接字与本地PostgreSQL进行通信,而另一个可能使用来自会话池的TCP连接与Oracle实例进行通信。

存在面向对象的编程以提供封装和抽象。即使所涉及的对象在0.5秒内创建,生存和死亡,两者都很有用。

答案 2 :(得分:1)

使用PHP,您无法使对象保持活动状态,因此您无法将其存储在会话中以获得性能。 PHP将始终在写入会话时序列化对象,并从会话中反序列化它。

要回答您的问题,是的,将对象存储在会话中非常常见,但不是出于性能原因。存储和读取会话很安静,所以我只会在那里寻找优化,如果你确定这是一个瓶颈。

答案 3 :(得分:0)

如果采用这种方法,可以确定要执行的操作是确保您的垃圾收集已完全正常工作。根据对象的不同,它可能会存储大量记录,在这种情况下,您将占用大量磁盘/数据库存储。

我是Codeigniter迷,但是那些物体很大,所以将它们存储起来是非常不明智的。安全是另一个因素-如果您在共享服务器上,并且有可能在对象中保存安全凭据,那么存储这些凭据也可能是不明智的。

我确实将对象存储在数据库中,但是只要确保垃圾收集正在运行即可。如果使用数据库,则Ubuntu中会有一个错误,该错误导致集合无法运行-在这种情况下,您需要通过ini_set对其进行强制。