【问题标题】:Removing objects form serialize data从序列化数据中删除对象
【发布时间】:2011-03-17 19:24:54
【问题描述】:

我正在尝试集成两个 PHP 脚本(app1、app2),并且我正在尝试从 app2 中的 app1 获取会话数据。

问题是当我尝试 unserialize 来自 app1 的会话数据时,我收到了少量错误,因为 PHP 试图为每个对象查找 __wakeup() 函数。

我无法使用 unserialize_callback_func 修复,因为 app2 使用它,所以它已经设置并且无法更改。

我不需要对象中的任何数据,有什么方法可以删除对象,这样它们就不会造成任何问题?

【问题讨论】:

  • 您得到的确切错误是什么? __wakeup 是一个神奇的方法,只有在它被定义时才会被调用,当没有这样的方法时引擎不应该抛出错误。
  • 错误来自 app2 unserialize_callback_func 设置。

标签: php object serialization


【解决方案1】:

您可以将unserialize_callback_func 设置为您自己的,然后再改回来。

$oldCallback = ini_get("unserialize_callback_func");

ini_set("unserialize_callback_func", "myNewCallback");
yourUnserialize();

ini_set("unserialize_callback_func", $oldCallback);

此外,如果 App2 中不存在对象,您还可以使用自动加载动态创建类(无需任何方法),但这似乎更hackisch

Scotts 评论更新:

这真的很hackisch,但它可能适合工作:

<?php
$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';

ini_set('unserialize_callback_func', 'mycallback');
function mycallback($classname)
{
    eval("class $classname {}");
}

var_dump(unserialize($serialized_object));
?>
// Prints:
object(a)#1 (1) {
  ["value"]=>
  string(3) "100"
}

【讨论】:

  • App2 中不存在对象,我想知道是否可以更改 unserialize_callback_func 但我无法动态创建类。
  • 我已经更新了我的答案以展示一个小的工作示例,即使 eval() 不是很好,它也是一种即时创建这些类的简单方法。希望对你有用
  • 有点冒险,但应该可以,我仍然认为应该有一种方法可以删除它们,或者在使用反序列化时不加载它们。
  • 同意,但我不想进行字符串解析和替换;)
猜你喜欢
  • 2010-12-09
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 2019-11-18
  • 2020-09-14
  • 2017-08-14
  • 2018-12-10
  • 2021-08-03
相关资源
最近更新 更多