在PHP中的请求之间存储对象而不进行序列化

时间:2011-07-28 17:58:54

标签: php serialization state persistent-storage

我正在用PHP编写一个有状态的Web应用程序,其中状态可能包含许多对象。此时,我将所有这些对象保存在$ _SESSION中,并在请求结束时将它们序列化。这有点痛苦,因为序列化整个会话需要几秒钟,而反序列化则需要更多时间。

我想尝试APC,因为我希望这些对象只是被memcopied而不是序列化。唉,似乎如果我向apc_store($object)提供一个对象,它似乎在将其传递给另一个进程之前将其序列化。 (故事说原始值和数组在没有序列化的情况下被复制,但这对我来说不是一个相关的解决方案,因为我的会话对象有很多(循环)引用。)

我的问题:是否有一种已知的方法可以保持对象在PHP中持久存在而无需在每次请求后将其序列化?我听说有传言说HipHop翻译可以帮助解决这个问题,但我没有在网上找到任何有用的例子。有人可以告诉我它是否可以在PHP中使用?

(我知道,我应该用Java或其他支持没有TCP连接的持久实例的语言编写这个项目)

1 个答案:

答案 0 :(得分:3)

每当您需要存储(冻结)对象时,都需要对其进行序列化。这与存储(APC,会话文件,数据库等)无关,这是因为脚本进程将终止,下次启动时,对象需要再次生效。

所以事情不能保持在“运行状态”,对象将始终被序列化以便存储。

众所周知,PHP序列化并不是最快的。您可以使用其他实现,例如igbinary PHP extension。它在透明会话处理旁边提供序列化/反序列化功能。也许这对你的场景有用。

在任何情况下:您在会话中存储的越多,您在请求开始时取消冻结或唤醒的次数就越多,所需的时间就越长。

相关:What is the php_binary serialization handler?