我使用Laravel 4.2在一個項目中工作,突然一個意外停電發生,當我再次oppened我的項目,我遇到了這個錯誤:如何解決反序列化()錯誤
unserialize(): Error at offset 0 of 319 bytes
這發生在任何頁面的項目。我怎樣才能解決這個問題?
我使用Laravel 4.2在一個項目中工作,突然一個意外停電發生,當我再次oppened我的項目,我遇到了這個錯誤:如何解決反序列化()錯誤
unserialize(): Error at offset 0 of 319 bytes
這發生在任何頁面的項目。我怎樣才能解決這個問題?
試試這個要明白什麼是錯的
try {
unserialize($data);
} catch ($e) {
error_log($data . PHP_EOL . print_r($e, true);
}
有時候,字符編碼可以搞砸你的序列化對象/變量。
嘗試使用的base64是安全的在所有情況下: 編碼:
$var = "somestuff";
$ouput = serialize(base64encode($var));
解碼:
$var = base64decode(unserialize($ouput);)
我不知道這是否爲時已晚在這裏給出一個答案。我正在使用Laravel 4.2進行一個項目,我從現在起4次遇到這個問題。看起來,當Laravel在會話文件中寫入時,PC發生死機或被迫關閉時發生。
解決方案:
1-不鼓勵生產。您必須刪除app/storage/session中的所有會話文件。
用戶(或PC)的Laravel會話鏈接到客戶端Cookie,Laravel將爲請求服務器上的信息的每個瀏覽器創建一個會話文件。在查看文件時,您不知道每個用戶的文件是什麼。因此刪除所有會話文件將會銷燬所有用戶會話。我找到了一個工作,以編程方式刪除單個用戶(或瀏覽器)的單個會話,用戶只需重試即可使用。
2-只有當您強制處理生產的緊急情況。這將是2個文件中的4行代碼。在您的圖片,一個方法readFromHandler被稱爲在照亮\會議\ Store.php存儲類,添加一個全局變量來捕捉會話ID(即會話文件的實際文件名):
protected function readFromHandler()
{
$data = $this->handler->read($this->getId());
$GLOBALS['sess_id'] = $this->getId();
return $data ? unserialize($data) : array();
}
而且有一個文件可以在應用程序準備就緒之前處理Laravel中的所有錯誤:\ Illuminate \ Exception Handler.php。更改方法handleEror這樣:
public function handleError($level, $message, $file = '', $line = 0, $context = array())
{
//Ensure the error is about unserialize() and is coming from Store.php
if(strpos ($message, 'unserialize(): Error at offset') !== false &&
strpos ($file, 'Store.php') !== false)
unlink('../app/storage/sessions/'.$GLOBALS['sess_id']);
if (error_reporting() & $level)
{
throw new ErrorException($message, 0, $level, $file, $line);
}
}
我知道你不應該改變Laravel核心,但我希望這將幫助您和其他人去了解它,並拿出一個更好的和100%可接受的解決方案。
它經常發生在你序列化一個以0索引開始的數組上。請嘗試操縱你要反序列化的數組索引並得到這個錯誤。使數組索引從1開始,然後序列化並反序列化並檢查。 –
我沒有序列化我的項目中的任何數組..請閱讀上面的描述,爲什麼我遇到了這個問題..我的代碼中的一切都是正確的,並在發生之前運行。 –