thinkphp中出現unserialize(): Error at offset 533 of 1857 bytes如何解決
一、總結
一句話總結:清緩存就好了,所以框架有問題可以考慮清緩存
清緩存
1、thinkphp中出現unserialize(): Error at offset 533 of 1857 bytes的原因是什么?
phpStorm改文件名自動更新了緩存 並且自動更新的緩存內容不對
出錯原因:移過來改名字的時候phpStorm的自動更新引用更新了緩存(我看的清清楚楚,沒截到圖),所以導致了錯誤

2、學thinkphp框架及其它框架很好且可行的措施是什么?
按着框架運行流程打印中間變量
按着框架運行流程,打印中間變量,肯定可以學好框架,畢竟排系統錯誤的時候就是這么排的
二、清緩存就好了
出現的原因應該是改變了文件名,但是緩存自動更新(我用的phpstorm自動更新相關文件)的不對,所以導致錯誤,所以清理一下緩存就好了

出錯原因:移過來改名字的時候phpStorm的自動更新引用更新了緩存(我看的清清楚楚),所以導致了錯誤

報錯示意圖

並且,dump一下出錯的位置的變量,也可以發現是緩存出了問題,改了名字的文件的路徑對不上

三、unserialize(): Error at offset 0 of 96 bytes出現的原因分析以及解決方法
參考:unserialize(): Error at offset 0 of 96 bytes出現的原因分析以及解決方法
https://blog.csdn.net/glx490676405/article/details/79041405
出現問題: 從數據庫中取出數據后進行反序列化后,php報錯 unserialize(): Error at offset 0 of 96 bytes;
分析原因:英文數據中含有中文字符串,所以我們就可以想到編碼的問題,serialize()函數對在不同編碼下對中文的處理結果是不一樣的。
再講gbk轉換成utf8的格式后,每個中文的編碼數從2個會增加到3個,所以會導致反序列化的時候判斷字符長度出現問題。
解決方法 : 使用正則表達式將序列化的數組中的表示字符長度的值重新計算一遍
具體代碼:php5.5以下 :
function mb_unserialize($str) { $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $str ); return unserialize($out); }
但是由於PHP本身 /e模式的漏洞,php5.5+,已經廢棄了這種用法
PHP 5.5+
function mb_unserialize($str) { return preg_replace_callback('#s:(\d+):"(.*?)";#s',function($match){return 's:'.strlen($match[2]).':"'.$match[2].'";';},$str); }
