这种情况发生的原因有多种可能,最大的可能就是在序列化数据的时候的编码和反序列化时的编码不一样导致字符串的长度出现偏差。例如数据库编码latin1和UTF-8字符长度是不一样的。
解决方案:
自己从网上找的小函数来纠正序列化字符串中字符串长度的问题
Utf-8
function mb_unserialize($serial_str) {
$serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
$serial_str= str_replace("\r", "", $serial_str);
return unserialize($serial_str);
}
ASC
function asc_unserialize($serial_str) {
$serial_str=preg_replace('!s:(\d+):"(.*?)";!se','"s:".strlen("$2").":\"$2\";"',$serial_str);
$serial_str= str_replace("\r", "", $serial_str);
return unserialize($serial_str);
}