项目上线后,都会使用一些异常监控,当然很多时候监控是有限制的,比如要监控PHP异常,类似这种一般都在输出人性化内容而不是直接输出错误内容,很多时候需要捕捉这类异常来进行代码调整。当然也可以定期去查看日志。


laravel5支持自定义异常处理,给这种需求提供了方便,我们完全可以扩展异常处理,通过发送邮件或短信。

打开 app/Exceptions/Handler.php  文件,修改 render 函数代码,增加发送邮件通知功能:

if (!$e instanceof \Symfony\Component\Debug\Exception\FlattenException) {
    $e = \Symfony\Component\Debug\Exception\FlattenException::create($e);
}
$exception = new \Symfony\Component\Debug\ExceptionHandler();
$content = $exception->getContent($e);
$css = $exception->getStylesheet($e);
\Mail::queue('errors.mail', [
    'url' => $request->fullUrl(),
    'request' => $request->all(),
    'method' => $request->getMethod(),
    'header' => $request->header(),
    'content' => $content,
    'css' => $css
        ], function ($message) {
    $message->to('[email protected]')
            ->cc('[email protected]')
            ->subject('程序异常');
});

原来的

return parent::render($request, $e);

是返回异常内容或403页面的,如果想页面返回更友好,可以去掉这个代码改成其它内容返回,可直接使用如形式的代码:

return response('服务器累了,稍后再试!');


邮件模板:


    
        系统异常,请及时维护!
        
        
    
    
        

请求地址:

        {{$url}}             

请求方式:

        {{$method}}         

请求参数:

        
            {{var_export($request, true)}}
        
        

请求头信息:

        
            {{var_export($header, true)}}
        
        

异常内容:

        
            {!!$content!!}
        
    


注意:邮件是通过队列发送的,以减少页面响应速度,实际使用时需要开启队列处理命令。


开启队列处理命令方法:

  1. 直接添加定时命令到 crontab

    crontab -e
    * * * * * php artisan queue:work 1>> /dev/null 2>&1  #启动队列监听
  2. 写到框架的 schedule 中,然后通过 schedule 模拟crontab定时处理内部所有命令

    打开 app/Console/Kernel.php 文件在 schedule 函数下添加代码:

    //监听队列

    $schedule->command('queue:work',$parameters)
        ->everyMinute()
        ->withoutOverlapping();

    然后添加定时命令:

    crontab -e
    * * * * * php artisan schedule:run 1>> /dev/null 2>&1   #启动schedule