代码之家  ›  专栏  ›  技术社区  ›  Jeremy DeGroot

建议使用serialize()跨多个请求持久化对象吗?

  •  1
  • Jeremy DeGroot  · 技术社区  · 14 年前

    在我正在进行的项目中,我有一个对象,它是一种具有数据库后端的集合。这个集合返回的确切结果取决于它的配置,而配置本身又取决于许多用户输入。我希望页面上有一个元素包含集合中的记录,并且可以通过AJAX请求动态更新。我突然想到这个主意 serialize() 这个对象,将其存储在memcache中,并将memcache键作为参数包含在我的AJAX调用中。然后我从memcahce检索字符串, unserialize() 并从集合中检索下一组记录。

    这是实现我想要的对象持久性的好方法吗?我考虑只存储配置,但我觉得这是一个更好的“设置它,忘记它”的解决方案,面对未来的变化,用户控件。我主要担心的是serialize可能存在一些我不知道的缺陷,这会使这个解决方案不健壮、不可靠或速度不快。我需要关心这些问题吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Mark Baker    14 年前

    serialize/unserialize可以很好地处理标量,但是在处理对象时问题会更大。我遇到了一些突出潜在隐患的问题。

    如果您的任何对象属性是资源,则无法序列化这些属性。您需要使用magic\uu sleep和\uu wakeup方法来干净地关闭资源属性,并在取消序列化时再次恢复它。

    如果您的集合包含具有循环引用的对象(例如,cellCollection对象是一个单元格对象数组,每个单元格对象都有一个指向父cellCollection对象的属性),则这些对象在取消序列化时不会被干净地还原。。。每个单元格的父对象实际上是原始父对象的克隆。同样,需要使用睡眠和唤醒来恢复真正的关系(不是一项琐碎的任务)。

        2
  •  1
  •   Morgan Tocker    14 年前

    如果序列化对象比从数据库中提取的查询更大,并且对它们应用了大量处理,那么您提出的实际上是一个非常好的优化。

    特别是两个参考: http://code.google.com/p/memcached/wiki/FAQ#Cache_things_other_than_SQL_data ! http://www.mysqlperformanceblog.com/2010/05/19/beyond-great-cache-hit-ratio/