【发布时间】:2011-07-28 17:58:54
【问题描述】:
我正在用 PHP 编写一个有状态的 Web 应用程序,其中的状态可能包含很多对象。此时,我将所有这些对象保存在 $_SESSION 中,并在请求结束时将它们序列化。这有点痛苦,因为序列化整个会话需要几秒钟,而反序列化则需要更多时间。
我想尝试 APC,因为我希望这些对象只是被内存复制,而不是序列化。唉,似乎如果我提供apc_store($object) 一个对象,它似乎无论如何都会在将它传递给另一个进程之前对其进行序列化。 (故事是原始值和数组在没有序列化的情况下被内存复制,但这对我来说不是一个相关的解决方案,因为我的会话对象有很多(循环)引用。)
我的问题:有没有一种已知的方法可以在 PHP 中保持对象的持久性,而不必在每次请求后对它们进行序列化?我听说HipHop 解释器可以帮助解决这个问题,但我没有在网上找到任何工作示例。有人可以告诉我在 PHP 中是否可行?
(我知道,我应该用 Java 或其他支持无需 TCP 连接的持久实例的语言编写这个项目)
【问题讨论】:
-
如果序列化你的 $_SESSION 需要几秒钟,你在 $_SESSION 中存储的太多了。使用适当的数据存储(如数据库),并仅存储/检索您需要的“会话”部分。
-
PHP 没有全局本地内存存储。如果您需要,您确实需要另一种语言(例如 Java)。或者按照建议清理您的会话。很有可能您可以通过在
__sleep方法中删除循环引用(如果这是 PHP 有问题的话)来节省大量时间,而是在__wakeup上存储一种恢复它们的方法。 -
@AlienWebguy:也序列化字符串。
-
在我的全状态 Web 应用程序中,我将大部分对象卸载到一个 xml 存储中,该存储也可以作为智能配置 xml。因此,我不需要序列化太多对象,而只需要序列化 xml 文件的子集(状态)。这仍然是一种服务器端方法,但您可以尝试将序列化卸载到客户端?但也许你序列化了太多的对象?为什么不在运行时将对象存储在文件中?
标签: php serialization state persistent-storage