2015-05-09 154 views
0

我使用Laravel 4.2在一個項目中工作,突然一個意外停電發生,當我再次oppened我的項目,我遇到了這個錯誤:如何解決反序列化()錯誤

unserialize(): Error at offset 0 of 319 bytes

這發生在任何頁面的項目。我怎樣才能解決這個問題?

enter image description here

+0

它經常發生在你序列化一個以0索引開始的數組上。請嘗試操縱你要反序列化的數組索引並得到這個錯誤。使數組索引從1開始,然後序列化並反序列化並檢查。 –

+0

我沒有序列化我的項目中的任何數組..請閱讀上面的描述,爲什麼我遇到了這個問題..我的代碼中的一切都是正確的,並在發生之前運行。 –

回答

0

試試這個要明白什麼是錯的

try { 
    unserialize($data); 
} catch ($e) { 
    error_log($data . PHP_EOL . print_r($e, true); 
} 
0

有時候,字符編碼可以搞砸你的序列化對象/變量。

嘗試使用的base64是安全的在所有情況下: 編碼:

$var = "somestuff"; 
$ouput = serialize(base64encode($var)); 

解碼:

$var = base64decode(unserialize($ouput);) 
0

我不知道這是否爲時已晚在這裏給出一個答案。我正在使用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%可接受的解決方案。