首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP serialize 与 unserialize 深度解析:数组/对象序列化存储与陷阱规避

     編輯:PHP 綜合知識

serialize() 将 PHP 变量(数组、对象、标量)转为可存储、可传输的字符串,保留类型与结构;unserialize() 还原。广泛用于 Session、缓存、数据库字段存储复杂结构。本文演示基本用法、对象序列化机制、安全风险与最佳实践。

基本用法:数组序列化

";
/* 输出:
a:8:{i:0;s:3:"周";i:1;s:3:"满";i:2;s:3:"和";i:3;s:6:"个人";i:4;s:6:"博客";i=5;s:20:"www.jb51.net";i:6;s:9:"周满和";i:7;s:12:"个人博客";}
*/
$c = unserialize($b);
print_r($c); // 还原原数组
?>

多维数组示例

 ["周", "满", "和"],
    'name_weburl' => ["周满和", "www.jb51.net"],
    'all'         => ['周满和个人博客' => 'www.jb51.net']
];
$b1 = serialize($a1);
$c1 = unserialize($b1);
print_r($c1);
?>

对象序列化:__sleep / __wakeup 魔术方法

id = $id;
        $this->name = $name;
        $this->pdo = new PDO(/* ... */);
    }

    // 指定序列化包含哪些属性
    public function __sleep() {
        return ['id', 'name']; // 排除 $pdo
    }

    // 反序列化后重建资源
    public function __wakeup() {
        $this->pdo = new PDO(/* ... */);
    }
}

$user = new User(1, 'Simon');
$ser = serialize($user); // 仅含 id、name
$newUser = unserialize($ser); // 自动调用 __wakeup 重建连接
?>

格式速查

安全风险与规避

  • 反序列化漏洞:不可信数据 unserialize() 可触发 __wakeup/__destruct 链攻击(POP 链)。严禁对用户可控数据反序列化。
  • PHP 7.0+ 支持 unserialize($data, ['allowed_classes' => ['User', 'DTO']]) 白名单机制,务必启用。
  • 跨语言/长期存储首选 JSON(json_encode/decode),可读、安全、生态通用。
  • Session 存储对象时,确保类定义在反序列化前已加载(spl_autoload_register)。

性能对比

serialize 约比 json_encode 快 20%-30%,但体积大 30%-50%。高频读写场景可考虑 igbinary 扩展(二进制格式、更快更小)。

序列化是把双刃剑:用对场景(Session、进程间通信)提效,用错场景(前端传参、长期持久化)埋坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
标识类型示例
a数组a:3:{i:0;s:3:"foo";i:1;i:123;i:2;d:1.5;}
O对象O:4:"User":2:{s:2:"id";i:1;s:4:"name";s:5:"Simon";}
s字符串s:5:"hello";
i整数i:42;
d浮点数d:3.14;
b布尔b:1;
NNULLN;