身为一个程序猿/媛,是不是经常遇到程序有异常
而又不能方便地进行调试的情况
让你抓狂?
(图片取自网络)
比如,支付开发的回调数据
比如,线上项目某个接口未知的异常
如果你是一位 phper,又恰好在使用 ThinkPHP3.2 系列框架,那么请继续,接下来拾光君将要阐述如何利用 tp3.2 与 slack 相结合,打造一个简单但好用的异常通知解决方案
thinkphp3.2的底层异常捕获机制
fatalError
用于捕获 php 脚本解析等严重异常 比如你把 echo 'abc' 写成了 echo1 'abc',可以被这个函数监控到
appError
用于捕获程序脚本运行时的用户级别的错误
appException
用于捕获没有被try{ }catch{ }处理的异常。(php的异常需要用户手动抛出,它不像 Java 那样可以自动抛出异常。这世上只有两种语言,一种是能主动抛出异常的,另一种是不能主动抛出异常的)
和两个信息输出函数
halt
用于向页面输出异常信息
trace
用于显示页面调用堆栈来源,能更有助于发现错误和异常产生的位置
重写 halt 函数重新定位错误信息输出的位置
halt 函数默认将错误信息输出到页面上,我们对其适当改造,将其输出到 slack 会话面板中。
有关 slack 如何搭建会话系统,可以参考下面这篇博文
我们先封装一个 POST 发送函数并添加到 Application\Common\Common\function.php 中,方便之后利用这个函数向 API 接口发送 POST 数据。
/**
* POST 发送数据
* @param $url 要提交数据的url
* @param $data 要提交的数据 array 或者 string
* @param $timeout 超时时间
* @param $count 超时后重新发送次数
*/
function requestPost($url='',$data=array(),$timeout=6,$count=3){
static $index = 0 ;
$index++;
if(empty($url)){
throw new exception('url参数不能为空');
}
$ch = curl_init();
if($ch){
//设置curl
$header = array(
'User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
);
//设置curl
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE); //不认证证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, 1);// post方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);// post数据
$content = curl_exec($ch);
if($content === false){
if(curl_errno($ch) == CURLE_OPERATION_TIMEDOUT){
if($index
//超时重发
requestPost($url,$data);
}
}
}
curl_close($ch);
} else {
$data = http_build_query($data);
$context = array(
'http'=>array(
'method'=>'POST',
'content'=>$data
)
);
$context = stream_context_create($context);
$content = file_get_contents($url,false,$context);
}
return $content;
}
最后几行改成
// 包含异常页面模板
$exceptionFile = C('TMPL_EXCEPTION_FILE',null,THINK_PATH.'Tpl/think_exception.tpl');
include $exceptionFile;
requestPost('https://hooks.slack.com/services/xxxxxx','{
"text": "错误信息:'.$error['message'].'\r\n所在文件:'.$error['file'].'\r\n错误定位:第'.$error['line'].'行"
}');
exit;
其中,https://hooks.slack.com/services/xxxxxx这里替换成你在 slack 申请的 webhook api。
然后我们来测试这个方案,先故意访问一个不存在的控制器
然后查看 slack 的 channel 频道面板
异常信息一览无余,而且还是主动推送过来的,之后只要你到任何能打开浏览器的地方,打开你的 slack 频道,就可以及时准时地对你的系统进行监控了。
领取专属 10元无门槛券
私享最新 技术干货