项目上线后,都会使用一些异常监控,当然很多时候监控是有限制的,比如要监控PHP异常,类似这种一般都在输出人性化内容而不是直接输出错误内容,很多时候需要捕捉这类异常来进行代码调整。当然也可以定期去查看日志。
laravel5支持自定义异常处理,给这种需求提供了方便,我们完全可以扩展异常处理,通过发送邮件或短信。
打开 app/Exceptions/Handler.php 文件,修改 render 函数代码,增加发送邮件通知功能:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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(
'程序异常'
);
});
|
原来的
1
|
return
parent::render(
$request
,
$e
);
|
是返回异常内容或403页面的,如果想页面返回更友好,可以去掉这个代码改成其它内容返回,可直接使用如形式的代码:
1
|
return
response(
'服务器累了,稍后再试!'
);
|
邮件模板:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
<
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
>
|
注意:邮件是通过队列发送的,以减少页面响应速度,实际使用时需要开启队列处理命令。
开启队列处理命令方法:
-
直接添加定时命令到 crontab
1crontab
-e
1* * * * * php artisan queue:work 1>>
/dev/null
2>&1
#启动队列监听
-
写到框架的 schedule 中,然后通过 schedule 模拟crontab定时处理内部所有命令
打开 app/Console/Kernel.php 文件在 schedule 函数下添加代码:
//监听队列
123$schedule
->command(
'queue:work'
,
$parameters
)
->everyMinute()
->withoutOverlapping();
然后添加定时命令:
1crontab
-e
1* * * * * php artisan schedule:run 1>>
/dev/null
2>&1
#启动schedule
本文转自 ttlxihuan 51CTO博客,原文链接:http://blog.51cto.com/php2012web/1919211 -