【发布时间】:2009-09-06 18:33:56
【问题描述】:
我正在用 PHP mysql 编程。 我最近接触了 OOP 编程。
所以我需要序列化我的对象并将它们存储到 SESSIONS。但是,我认为大型会话正在减慢我网页的刷新和加载速度。
是否有替代方法(序列化反序列化)以便我仍然可以在网页之间共享我的对象并缩短加载时间。
谢谢 拉胡尔
【问题讨论】:
我正在用 PHP mysql 编程。 我最近接触了 OOP 编程。
所以我需要序列化我的对象并将它们存储到 SESSIONS。但是,我认为大型会话正在减慢我网页的刷新和加载速度。
是否有替代方法(序列化反序列化)以便我仍然可以在网页之间共享我的对象并缩短加载时间。
谢谢 拉胡尔
【问题讨论】:
您应该首先分析实际的瓶颈是什么。真的是对象序列化/反序列化吗?
如果是这样,问问自己,是否所有对象都需要出现在每个请求中,或者它们是否可以按需重构。然后你可以只存储键值来重建这些对象而不是整个对象。
但如果您需要所有这些对象,请使用比默认位置(文件系统中的文件)更高性能的存储位置,也许是内存(memcache)。
【讨论】:
session.save_handler (docs.php.net/manual/en/…) 或session_save_handler 函数(docs.php.net/manual/en/function.session-set-save-handler.php)。
从页面加载到页面加载,您存储的所有对象都是必需的吗?如果没有,那么您需要将这些对象排除在会话之外,并且仅在您需要它们的页面上重建它们。
您存储在会话中的每个对象都会在每次页面加载时被序列化和反序列化,无论您是否真的需要它。因此,您需要将其保持在最低限度。
另一种选择是仅存储重建会话中对象所需的内容,而不是整个对象。例如,您可以在会话中存储数据库 ID,并在需要时从数据库中重建对象。
【讨论】:
根据经验,您应该尝试将会话大小限制为 4KB 或更小(与您使用的编程语言无关)。如果您的数据比这更大,您应该开始使用数据库中的表(如 MySQL/PostgreSQL/...)来持久化数据。
示例:存储博客文章的草稿
draft=1)。相信我,如果您选择 DB 会更方便(而且您不必为序列化而烦恼)。
【讨论】: