如何修复unserialize()错误

时间:2015-05-09 11:46:35

标签: php laravel

我正在使用Laravel 4.2进行一个项目,突然意外停电了,当我再次操作我的项目时,我遇到了这个错误:

  

unserialize():偏移0处的错误319字节

这发生在项目的任何页面中。我怎样才能解决这个问题?

enter image description here

3 个答案:

答案 0 :(得分:1)

我不知道在这里给出答案是否为时已晚。我使用Laravel 4.2进行项目,从现在开始我遇到过这个问题4次。当Laravel在会话文件上写作时,PC似乎会冻结或被迫关闭。

解决方案:

1-不鼓励生产。您必须删除app / storage / session中的所有会话文件。

用户(或PC)的Laravel会话链接到客户端Cookie,Laravel将为每个在您的服务器上请求信息的浏览器创建会话文件。在查看文件时,您不知道每个用户的文件是什么。因此删除所有会话文件将破坏所有用户会话。我找到了一个以编程方式删除单个用户(或浏览器)的单个会话的工作,用户只需要重试,它就可以工作。

2-只有你有力量处理生产的紧迫性。这将是2个文件中的4行代码。在你的图片中,在Illuminate \ Session \ Store.php中的Store类中调用readFromHandler方法,添加一个全局变量来捕获SessionId(这是会话文件的真实文件名):

protected function readFromHandler()
{
    $data = $this->handler->read($this->getId());

    $GLOBALS['sess_id'] = $this->getId();

    return $data ? unserialize($data) : array();
}

还有一个文件可以在准备好App之前处理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 Core,但我希望这能帮助你和其他人理解它,并提出一个更好的,100%可接受的解决方案。

答案 1 :(得分:0)

试试这个以了解错误

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

答案 2 :(得分:0)

有时,char编码会搞乱你的序列化对象/变量。

尝试在所有情况下使用base64是安全的: 编码:

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

解码:

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