删除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()发生此错误时。
答案 0 :(得分:0)
您要做的是扩展会话驱动程序(目前看来您正在使用文件会话驱动程序),这是文档的相关部分:http://laravel.com/docs/4.2/extending#session