【问题标题】:Maintain XML Document state after session serialization会话序列化后保持 XML 文档状态
【发布时间】:2011-09-12 09:31:33
【问题描述】:

我想存储在会话中的类实例包含一个加载的 DOMDocuments 数组。

正如此处的答案之一所述:PHP quirks and pitfalls,当您序列化包含 XML 的对象时,XML 结构无法在反序列化过程中继续存在。据我了解 PHP5 应该自动序列化会话数据,所以我需要知道的是如何使 XML 在序列化/反序列化过程中幸存下来?

我已经阅读过,但似乎无法完成,再加上使用自动序列化/反序列化写入和读取会话文件所涉及的开销似乎使得只读取和写入 XML 文件更可取__sleep 和 __wakeup 上的类实例。是这样吗?

【问题讨论】:

  • 如果您想在文件中存储某些内容,请考虑使用其他更通用的数据格式,例如JSON。有json_decode()json_encode() 可以帮助您。见json.org/xml.html

标签: php xml session serialization


【解决方案1】:

http://php.net/manual/en/function.serialize.php

这对于在不丢失类型和结构的情况下存储或传递 PHP 值很有用。`

要序列化的值。 serialize() 处理所有类型,除了 resource-type。您甚至可以 serialize() 包含对其自身的引用的数组。您正在序列化的数组/对象内的循环引用也将被存储。任何其他参考都将丢失。

或许可以考虑将原始数据存入memcache、数据库、
当你的会话指向那个时(比如内存缓存键、数据库行 ID)


补充阅读

您可能会觉得以下内容很有趣(也许我错了)-

【讨论】:

  • 对不起,如果我在这里很密集,但这是否意味着由于 DOMDocuments 是资源,它们没有被序列化,因此不会存储在当前页面之外的会话中?
  • 这没有记录,但基于此描述As resource variables hold special handlers to opened files, database connections, image canvas areas and the like ...等包括simplexml、memcache、dom..etc
  • 非常有趣 :) 不幸的是,如果数据库是一个选项,我根本不会使用 XML!我想现在我会继续将任何更改写回我的类 __sleep 函数中的文件。
  • 内存缓存? apc(希望你不在分布式环境中)
  • 我认为 memcache 出于同样的原因。 Object and other non-scalar types are serialized before saving, so it's impossible to store resources (i.e. connection identifiers and others) in the cache. php.net/manual/en/memcache.examples-overview.php
【解决方案2】:

你为什么不干脆export the DOMDocument as a string,然后序列化这个字符串?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-07
    • 2013-09-24
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多