項目上線後,都會使用一些異常監控,固然不少時候監控是有限制的,好比要監控PHP異常,相似這種通常都在輸出人性化內容而不是直接輸出錯誤內容,不少時候須要捕捉這類異常來進行代碼調整。固然也能夠按期去查看日誌。php
laravel5支持自定義異常處理,給這種需求提供了方便,咱們徹底能夠擴展異常處理,經過發送郵件或短信。css
打開 app/Exceptions/Handler.php 文件,修改 render 函數代碼,增長髮送郵件通知功能:
html
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('name@admin.com') ->cc('name1@admin.com') ->subject('程序異常'); });
原來的laravel
return parent::render($request, $e);
是返回異常內容或403頁面的,若是想頁面返回更友好,能夠去掉這個代碼改爲其它內容返回,可直接使用如形式的代碼:bash
return response('服務器累了,稍後再試!');
郵件模板:服務器
<HTML> <HEAD> <TITLE>系統異常,請及時維護!</TITLE> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <STYLE> html{color:#000;background:#FFF;} body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;} table{border-collapse:collapse;border-spacing:0;} fieldset,img{border:0;} address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;} li{list-style:none;}caption,th{text-align:left;} q:before,q:after{content:'';} abbr,acronym{border:0;font-variant:normal;} sup{vertical-align:text-top;} sub{vertical-align:text-bottom;} input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;} input,textarea,select{*font-size:100%;} legend{color:#000;} html { background: #eee; padding: 10px } img { border: 0; } #sf-resetcontent { width:970px; margin:0 auto; } {!!$css!!} </style> </HEAD> <BODY> <h2>請求地址:</h2> {{$url}} <h2>請求方式:</h2> {{$method}} <h2>請求參數:</h2> <pre> {{var_export($request, true)}} </pre> <h2>請求頭信息:</h2> <pre> {{var_export($header, true)}} </pre> <h2>異常內容:</h2> <pre> {!!$content!!} </pre> </BODY> </HTML>
注意:郵件是經過隊列發送的,以減小頁面響應速度,實際使用時須要開啓隊列處理命令。app
開啓隊列處理命令方法:框架
直接添加定時命令到 crontabide
crontab -e
* * * * * php artisan queue:work 1>> /dev/null 2>&1 #啓動隊列監聽
寫到框架的 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