PHP无法反序列化Redis中Python存储的序列化缓存数据,如何处理?
问题解答
1. 存储的数据格式
你Redis中存储的是Python专属的pickle序列化二进制数据,输出中开头的\x80\x04就是pickle v4协议的固定标识。这种格式是Python特有的对象序列化结构,PHP原生没有对应的解析逻辑,所以直接读取打印会显示为乱码二进制内容。
2. 读取反序列化的可行方案
方案1:Python侧调整为通用序列化格式(优先推荐,跨语言兼容性最好)
修改Python应用的存储逻辑,把会话数据序列化为JSON格式再存入Redis,两边均可直接解析:
- Python侧存数据示例:
import json import redis r = redis.Redis() session_data = { "_permanent": True, "identity_context_data": { "_authenticated": True, "_username": "your_username" } } # 替换原pickle.dumps逻辑为json序列化 r.set("mp-app-session", json.dumps(session_data))
- PHP侧读取解析代码:
$arList = $redis->mGet(['mp-app-session']); $session_data = json_decode($arList[0], true); echo '<pre>';print_r($session_data);die;
方案2:PHP侧安装pickle解析扩展(仅适用于无法修改Python侧代码的场景)
安装PHP的pickle解析扩展,直接反序列化二进制数据:
- 安装扩展命令:
pecl install pickle - 解析代码示例:
$arList = $redis->mGet(['mp-app-session']); $session_data = pickle_decode($arList[0]); echo '<pre>';print_r($session_data);die;
注意:pickle序列化内容存在反序列化安全风险,请确保你读取的数据源完全可信,避免执行恶意构造的序列化内容。
内容的提问来源于stack exchange,提问作者Pand005
相关产品推荐
相关产品推荐

