首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

程序有异常?推送来帮忙

身为一个程序猿/媛,是不是经常遇到程序有异常

而又不能方便地进行调试的情况

让你抓狂?

(图片取自网络)

比如,支付开发的回调数据

比如,线上项目某个接口未知的异常

如果你是一位 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 频道,就可以及时准时地对你的系统进行监控了。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180303G08YFQ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券