Laravel 4.2 - 我修复了' unserialize():错误偏移'错误,但现在如何在不更改Laravel Core的情况下解决?

时间:2015-11-11 21:17:25

标签: php laravel laravel-4

删除app / storage / sessions中的所有会话文件将正常修复它。但如果它发生在生产中,这将破坏每个用户会话,因为一个用户会话已损坏。如果从活动会话文件的内容中删除某些字符,则可以强制此错误。

我的解决方案是修改Laravel核心。 这是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 Vendor Core之外的会话ID(会话文件名)(例如:在应用程序,全局等)并在设置Laravel App之前捕获该错误方式,因为未达到此App :: error()发生此错误时。

1 个答案:

答案 0 :(得分:0)

您要做的是扩展会话驱动程序(目前看来您正在使用文件会话驱动程序),这是文档的相关部分:http://laravel.com/docs/4.2/extending#session