关键词搜索

源码搜索 ×
×

Thinkphp5.X异常接管后通过钉钉机器人推送通知

发布2022-06-11浏览686次

详情内容

大多团队在生产环境下都会关闭app_debug,所以相对应的错误信息就不能实时查看到。以下分享一个目前团队项目正在用的生产环境下相关技术人员能第一时间获取通知的方法:

先上效果图:

以上通知是在钉钉中显示!

下面介绍开发步骤:

1:Thinkphp版本需在5.X或以上,在config/app.php中接管异常处理

(个人案例中调用方式,具体命名依照对应项目建立)

'exception_handle' => '\\app\\Common\\Controller\\Exception',

具体操作可以参考官方文档:https://www.kancloud.cn/manual/thinkphp5_1/354092

2:在异常接管方法中实现以下代码

  1. <?php
  2. /*
  3. * 异常接管
  4. */
  5. namespace app\Common\Controller;
  6. use Exception;
  7. use think\exception\Handle;
  8. use think\exception\HttpException;
  9. use think\exception\ValidateException;
  10. class Exception extends Handle {
  11. public function render(Exception $e) {
  12. if (method_exists($e, 'getStatusCode')) {
  13. // 参数验证错误
  14. if ($e instanceof ValidateException) {
  15. return json($e->getError(), 422);
  16. }
  17. // 请求异常
  18. if ($e instanceof HttpException && request()->isAjax()) {
  19. return response($e->getMessage(), $e->getStatusCode());
  20. }
  21. if ($e->getStatusCode() == 404) {
  22. $module = \think\facade\Request::module();
  23. !$module and $module = 'index';
  24. return view($module . '@public/404');
  25. }
  26. if ($e->getStatusCode() == 500) {
  27. return parent::render($e);
  28. }
  29. } else {
  30. $file = $e->getFile();
  31. $line = $e->getLine();
  32. $code = parent::getCode($e);
  33. $message = parent::getMessage($e);
  34. $error_message = '[' . $code . '] ErrorException in ' . $file . ' line ' . $line . PHP_EOL . $message;
  35. // 此处为钉钉server
  36. $server = new \app\Server\DingdingServer();
  37. $data = [
  38. 'text' => ['content' => $error_message]
  39. ];
  40. $server->robotSend($data);
  41. }
  42. // 其他错误交给系统处理
  43. return parent::render($e);
  44. }
  45. }

3:钉钉Server的创建

  1. <?php
  2. /**
  3. * 钉钉开放API
  4. * https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
  5. */
  6. namespace app\Server;
  7. class DingdingServer {
  8. private $API_URL = "https://oapi.dingtalk.com/robot/send?access_token=xxxxx";
  9. public function __construct() {
  10. }
  11. /**
  12. *
  13. * @param array $data
  14. * @param string $msgtype text link markdown actionCard
  15. * @return boolean
  16. */
  17. public function robotSend($data = [], $msgtype = 'text') {
  18. if (empty($data)) {
  19. return false;
  20. }
  21. $final_data = $data + ['msgtype' => $msgtype];
  22. $data_string = json_encode($final_data);
  23. $webhook = $this->API_URL;
  24. $result = $this->request_by_curl($webhook, $data_string);
  25. return $result;
  26. }
  27. protected function request_by_curl($remote_server, $post_string) {
  28. $ch = curl_init();
  29. curl_setopt($ch, CURLOPT_URL, $remote_server);
  30. curl_setopt($ch, CURLOPT_POST, 1);
  31. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
  32. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json;
  33. charset = utf-8'));
  34. curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
  35. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  36. // 线下环境不用开启curl证书验证, 未调通情况可尝试添加该代码
  37. // curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
  38. // curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
  39. $data = curl_exec($ch);
  40. curl_close($ch);
  41. return $data;
  42. }
  43. }

此处钉钉接口需要一个access_token参数,具体操作步骤参考:

1:先下载PC版钉钉

2:发起群聊,添加至少2人创建群聊

3:点击群聊界面右上角三个点中的 群机器人,选择 添加机器人,选择最后一个 自定义

 

 

 

4:钉钉API地址就在webhook中

钉钉自定义机器人官方文档自定义机器人安全设置 - 钉钉开放平台

到这里,生产环境下即使关闭了app_debug,我们也能第一时间收到异常记录了!特别提醒,钉钉貌似每分钟只能发送20条推送。

其它参考:

tp5接入钉钉机器人_tjg888888的博客-CSDN博客

推送通知_Thinkphp6.0.X异常接管后通过钉钉机器人推送通知_weixin_39842237的博客-CSDN博客

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载