上一篇
想象你正在开发一个电商网站,用户小明把三件商品加入购物车:一件T恤(ID:1001)、一双运动鞋(ID:2005)和一个水杯(ID:3012),当小明暂时离开网站,服务器如何记住他的购物车内容?这就是PHP序列化大显身手的地方!
简单说,PHP序列化就是把PHP变量(数组、对象等)"打包"成字符串格式,方便存储或传输,就像把乐高玩具拆解装盒(序列化),需要时再按说明书拼回原样(反序列化)。
PHP提供了两个核心函数:
$data = ['user' => '小明', 'cart' => [1001, 2005, 3012]]; $serialized = serialize($data); // 序列化 $original = unserialize($serialized); // 反序列化
执行后$serialized
会变成类似这样的字符串:
a:2:{s:4:"user";s:6:"小明";s:4:"cart";a:3:{i:0;i:1001;i:1;i:2005;i:2;i:3012;}}
这个"密码"其实很有规律:
a
表示数组,后面的数字是元素个数s
表示字符串,数字是长度i
表示整型PHP默认使用序列化存储$_SESSION
,当用户登录后:
$_SESSION['user'] = ['id' => 123, 'name' => '小明']; // 实际被序列化为字符串存储在服务器
保存用户偏好设置到数据库:
class UserPrefs { public $theme = 'light'; public $fontSize = 14; } $prefs = new UserPrefs(); $prefs->fontSize = 16; // 存入数据库前序列化 $db->save('user_123', serialize($prefs)); // 读取时反序列化 $restoredPrefs = unserialize($db->read('user_123'));
缓存复杂查询结果:
$products = $db->query('SELECT * FROM products WHERE category="electronics"'); $cache->set('electronic_products', serialize($products));
当序列化对象时,可以控制哪些属性被保存:
class User { public $name; private $password; // 敏感信息不应序列化 public function __sleep() { return ['name']; // 只序列化name属性 } public function __wakeup() { $this->password = ''; // 反序列化时重置密码 } }
反序列化用户提供的数据存在安全风险:
// 危险操作!可能执行恶意代码 $data = unserialize($_COOKIE['user_data']); // 更安全的替代方案:JSON $safeData = json_decode($_COOKIE['user_data'], true);
处理10000条记录的基准测试(2025年8月数据):
虽然JSON更通用,但PHP序列化有其优势:
$obj = new stdClass(); $obj->date = new DateTime(); // DateTime对象 $json = json_encode($obj); // 日期对象会被转为空对象{} $phpSerialized = serialize($obj); // 完整保留对象信息
回到最初的问题,现代电商平台可能这样实现:
// 用户添加商品时 $_SESSION['cart'] = serialize([ 'items' => [1001 => 1, 2005 => 1, 3012 => 1], // 商品ID=>数量 'last_update' => new DateTime() ]); // 页面加载时 $cart = unserialize($_SESSION['cart']); echo "小明的购物车有".count($cart['items'])."件商品";
PHP序列化就像数据的时光胶囊,让复杂结构在不同请求间保持鲜活,掌握它,你的数据处理能力将更上一层楼!
本文由 闳夜梅 于2025-08-01发表在【云服务器提供商】,文中图片由(闳夜梅)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/508290.html
发表评论