thinkphp中出現unserialize(): Error at offset 533 of 1857 bytes如何解決

thinkphp中出現unserialize(): Error at offset 533 of 1857 bytes如何解決

1、總結

一句話總結:清緩存就行了,因此框架有問題能夠考慮清緩存

清緩存

 

一、thinkphp中出現unserialize(): Error at offset 533 of 1857 bytes的緣由是什麼?

phpStorm改文件名自動更新了緩存 而且自動更新的緩存內容不對

出錯緣由:移過來更名字的時候phpStorm的自動更新引用更新了緩存(我看的清清楚楚,沒截到圖),因此致使了錯誤php

 

二、學thinkphp框架及其它框架很好且可行的措施是什麼?

按着框架運行流程打印中間變量

按着框架運行流程,打印中間變量,確定能夠學好框架,畢竟排系統錯誤的時候就是這麼排的html

 

 

 

2、清緩存就行了

 

出現的緣由應該是改變了文件名,可是緩存自動更新(我用的phpstorm自動更新相關文件)的不對,因此致使錯誤,因此清理一下緩存就行了正則表達式

 

 

出錯緣由:移過來更名字的時候phpStorm的自動更新引用更新了緩存(我看的清清楚楚),因此致使了錯誤thinkphp

 

報錯示意圖數據庫

 而且,dump一下出錯的位置的變量,也能夠發現是緩存出了問題,改了名字的文件的路徑對不上數組

 

 

3、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;php框架

分析緣由:英文數據中含有中文字符串,因此咱們就能夠想到編碼的問題,serialize()函數對在不一樣編碼下對中文的處理結果是不同的。框架

再講gbk轉換成utf8的格式後,每一箇中文的編碼數從2個會增長到3個,因此會致使反序列化的時候判斷字符長度出現問題。phpstorm

解決方法 : 使用正則表達式將序列化的數組中的表示字符長度的值從新計算一遍

具體代碼: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);
}
相關文章
相關標籤/搜索