PHP反序列化不断抛出相同的错误超过100次
时间:2020-03-06 14:34:52 来源:igfitidea点击:
我有一个大型2D数组,我对其进行序列化和base64_encode并放入数据库中。在另一页上,我将数组拉出,当我对baseized_decode进行序列化的数组时,我可以将其回显,并且它看起来确实有效。
但是,如果我尝试unserialize(base64_decode($ serializedArray))
,它将抛出相同的错误,几乎使Firefox崩溃。
错误是:
Warning: unserialize() [function.unserialize]: Node no longer exists in /var/www/dev/wc_paul/inc/analyzerTester.php on line 24
我会包含我回显的整个序列化数组,但上次尝试以这种形式进行操作时,它使Firefox崩溃了。
有谁知道为什么会这样?
解决方案
我们确定要只是序列化一个数组,而不是序列化一个对象(例如DOMNode吗?),就像资源一样,并非所有类都对序列化感到满意。以DOM为例(错误提示我们正在使用它),每个节点都有对parentNode的引用,并且如果在未序列化节点时不存在parentNode,则无法重新创建该参考,随之而来的问题。
我建议将dom树作为XML保存到数据库中,并稍后再加载回去。
确保数据库字段足够大以容纳序列化的数组。序列化的数据在PHP中空间效率非常低,许多DB(例如MySQL)会静默截断太长的字段值。
数组中有什么类型的元素? serialize / unserialize不适用于内置PHP对象,这通常是导致该错误的原因。
另外,根据评论,这不是问题,但是要节省数据库中的空间,请不要对数据进行base64编码,只需对其进行转义即可。即对于mysql,请使用mysql_real_escape_string。
确保我们不序列化资源,资源也不能序列化。
资源@ php.net