2015-05-09 153 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%可接受的解决方案。