Php Laravel 4.2-我已经修复了';unserialize():偏移量处出错';错误,但现在我如何在不更改Laravel Core的情况下工作?

Php Laravel 4.2-我已经修复了';unserialize():偏移量处出错';错误,但现在我如何在不更改Laravel Core的情况下工作?,php,laravel,laravel-4,Php,Laravel,Laravel 4,删除app/storage/sessions中的所有会话文件将正常修复该问题。但是,如果它发生在生产环境中,这将破坏每个用户的会话,仅仅因为一个用户会话已损坏。如果从活动会话文件的内容中删除某些字符,则可以强制执行此错误 我的解决方案是修改Laravel core。 这是2个文件中的4行代码。在Lightlight\Session\Store.php中的Store类中调用了readFromHandler方法,我添加了一个全局变量来捕获SessionId(即会话文件的真实文件名): 还有一个文件可

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

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

还有一个文件可以在应用程序准备就绪之前处理Laravel中的所有错误:\light\Exception Handler.php。我将方法HandleError更改为:

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供应商核心(例如:应用内、全局等)之外的会话Id(会话文件名),并在安装Laravel应用之前捕获该错误,因为发生此错误时无法访问此应用::Error()。

您要做的是扩展会话驱动程序(看起来您正在使用文件会话驱动程序),下面是文档的相关部分:

您要做的是扩展会话驱动程序(看起来您正在使用文件会话驱动程序),这是文档的相关部分:

黑客不是解决方案,你首先需要了解数据是如何被破坏的-这不是正常的行为,我知道,我不满意,这就是为什么我提出一个问题。事实上,我认为当我的笔记本电脑冻结时,数据被破坏了,放慢速度,然后我就不满意了o关机。或者我可以手动修改会话文件,这将导致相同的错误。在Ubuntu服务器产品上,这个错误几乎是不可能的,但你永远不知道……我想,除非你在生产或登台中看到过这种情况,否则就不值得花时间。如上所述,如果这只是在devel中发生的话opment,在一台机器上,然后我就不会费心尝试用代码来修复它-然后问题就出在你的计算机上。我尝试扩展会话,但徒劳无功。我认为laravel无论如何都不会让我们在App::error中捕获sessionId,因为错误发生在正确流程中的任何应用程序类准备好使用之前。这是laravel bug,不是我们的。所以我完全同意你们两个@halfer和Steve的观点,一天的免费时间就足够了。谢谢你们!黑客不是解决方案,你们首先需要知道数据是如何被破坏的——这不是我知道的正常行为,我不满意,这就是为什么我提出一个问题。事实上,我认为数据是正确的当我的笔记本电脑冻结时发生故障,速度变慢,然后我被迫关闭电源。或者我可以手动修改会话文件,这将导致相同的错误。在Ubuntu服务器产品上,这个错误几乎是不可能的,但你永远不知道……我想,除非你在生产或登台中看到这种情况,否则它不值得在上花费时间。如上所述,如果这只是在一台机器上的开发过程中发生的,那么我就不会费心在代码中修复它-那么问题出在您的计算机上。我尝试扩展会话,但徒劳无功。我想laravel无论如何都不会让我们在App::error中捕获sessionId,因为错误发生在pro中的任何应用程序类之前per flow已经可以使用了。这是一个laravel bug,不是我们的。所以我完全同意你们两个@halfer和Steve的观点,一天的免费时间就足够了。谢谢你们!谢谢你们的提示,我尝试了,但是这个错误发生在laravel应用程序准备好之前,所以App::error永远不会发现它。因为这是一个开发环境问题,我选择了两个人对我的问题的建议。这是一个laravel错误,因此我认为任何适当的解决方法都受到laravel本身的限制。感谢提示,我尝试了它,但这个错误发生在laravel应用程序准备就绪之前,所以App::error永远不会发现它。因为这是一个开发环境问题,我在我的问题上采纳了两个人的建议。这是一个laravel bug,所以我认为任何适当的解决方法都受到laravel本身的限制。
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);
    }
}