#0 [8]ErrorException in Driver.php line 264
unserialize(): Error at offset 0 of 474 bytes
TP6中session读取时,报错如上,在框架文件Driver.php第264行unserialize()反序列化方法
定位问题:
一、两个项目序列化存储内容不相同
TP5.1中session存储redis,内容:
dev:|a:3:{s:7:"captcha";a:1:{s:3:"key";s:60:"wob2BfGTv3DGVsa";}s:6:"userid";i:1;s:8:"username";s:6:"baibai";}
TP6中session存储redis,内容:
a:3:{s:7:"captcha";a:1:{s:3:"key";s:60:"wob2BfGTv3DGVsa";}s:6:"userid";i:1;s:8:"username";s:6:"baibai";}
使用TP6框架读取TP5存储的session内容时,内容中多了前缀 "dev:|" ,然后报错如上。
目前手动解决方法替换字符串 "dev:|"。
原代码:
protected function unserialize($data)
{
if (is_numeric($data)) {
return $data;
}
$unserialize = $this->options['serialize'][1] ?? "unserialize";
return $unserialize($data);
}
修改后(手动调整兼容数据):
protected function unserialize($data)
{
if (is_numeric($data)) {
return $data;
}
$unserialize = $this->options['serialize'][1] ?? "unserialize";
// todo redis保存数据兼容json
// todo 注:tp5保存json,$data变量为json字符串,报错:unserialize(): Error at offset 0 of 215 bytes
json_decode($data, false);
if (json_last_error() == JSON_ERROR_NONE){
return json_decode($data, true);
}
// todo 兼容TP5,去掉前缀(TP5带有前缀)
$prefix = env('SESSION.PREFIX').'|';
if (strpos($data, $prefix) !== false){
$data = str_replace($prefix,'',$data);
}
return $unserialize($data);
}
二、两个项目存储数据的方式不同
一个项目使用序列化存储数据,一个项目使用json存储数据。
unserialize反序列化解析json时,报错:
unserialize(): Error at offset 0 of 215 bytes
protected function unserialize($data)
{
if (is_numeric($data)) {
return $data;
}
$unserialize = $this->options['serialize'][1] ?? "unserialize";
// todo redis保存数据兼容json
// todo 注:tp5保存json,$data变量为json字符串,报错:unserialize(): Error at offset 0 of 215 bytes
json_decode($data, false);
if (json_last_error() == JSON_ERROR_NONE){
return json_decode($data, true);
}
return $unserialize($data);
}