我正在用PHP编写一个有状态的Web应用程序,其中状态可能包含许多对象。此时,我将所有这些对象保存在$ _SESSION中,并在请求结束时将它们序列化。这有点痛苦,因为序列化整个会话需要几秒钟,而反序列化则需要更多时间。
我想尝试APC,因为我希望这些对象只是被memcopied而不是序列化。唉,似乎如果我向apc_store($object)
提供一个对象,它似乎在将其传递给另一个进程之前将其序列化。 (故事说原始值和数组在没有序列化的情况下被复制,但这对我来说不是一个相关的解决方案,因为我的会话对象有很多(循环)引用。)
我的问题:是否有一种已知的方法可以保持对象在PHP中持久存在而无需在每次请求后将其序列化?我听说有传言说HipHop翻译可以帮助解决这个问题,但我没有在网上找到任何有用的例子。有人可以告诉我它是否可以在PHP中使用?
(我知道,我应该用Java或其他支持没有TCP连接的持久实例的语言编写这个项目)
答案 0 :(得分:3)
每当您需要存储(冻结)对象时,都需要对其进行序列化。这与存储(APC,会话文件,数据库等)无关,这是因为脚本进程将终止,下次启动时,对象需要再次生效。
所以事情不能保持在“运行状态”,对象将始终被序列化以便存储。
众所周知,PHP序列化并不是最快的。您可以使用其他实现,例如igbinary
PHP extension。它在透明会话处理旁边提供序列化/反序列化功能。也许这对你的场景有用。
在任何情况下:您在会话中存储的越多,您在请求开始时取消冻结或唤醒的次数就越多,所需的时间就越长。