Laravel 4.2-我已经修复了';unserialize():偏移量';处出错;错误,但现在我如何在不


Laravel 4.2 - I have fixed 'unserialize(): Error at offset' Error, but now How can I work around without changing Laravel Core?

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

我的解决方案是修改Laravel核心。这是2个文件中的4行代码。方法readFromHandler在Illuminate''Session''Store.php的Store类中调用,我添加了一个全局变量来捕获SessionId(这是会话文件的真实文件名):

protected function readFromHandler()
{
    $data = $this->handler->read($this->getId());
    $GLOBALS['sess_id'] = $this->getId();
    return $data ? unserialize($data) : array();
}

还有一个文件可以在准备好应用程序之前处理Laravel中的所有错误:''Illuminate''Exception Handler.php.I将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::Error()。

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

相关文章: