我正在使用Laravel 4.2进行一个项目,突然意外停电了,当我再次操作我的项目时,我遇到了这个错误:
unserialize():偏移0处的错误319字节
这发生在项目的任何页面中。我怎样才能解决这个问题?
答案 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);)