当前位置:首页 > PHP > Thinkphp6.0.X异常接管后通过钉钉机器人推送通知

宝塔服务器面板,一键全能部署及管理,送你3188元礼包,点我领取

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

原创 2020-03-22 PHP 1742
分享给朋友:

5.X版本请移步: Thinkphp5.X异常接管后通过钉钉机器人推送通知

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

先上效果图:

QQ截图20190402163522.png

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

下面介绍开发步骤:

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

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

// 绑定自定义异常处理handle类
'think\exception\Handle'       => '\\app\\common\\exception',

然后在 app 下的 common 文件夹下新建一个 exception.php 文件

具体操作可以参考官方文档:https://www.kancloud.cn/manual/thinkphp6_0/1037615#_29

案例中我做了些许改动,如需修改请自行对应目录。

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

<?php

namespace app\common;

use think\exception\Handle;
use think\exception\HttpException;
use think\exception\ValidateException;
use think\Response;
use Throwable;

class Exception extends Handle
{

    public function render($request, Throwable $e): Response
    {
        if (method_exists($e, 'getStatusCode')) {
            // 参数验证错误
            if ($e instanceof ValidateException) {
                return json($e->getError(), 422);
            }
            // 请求异常
            if ($e instanceof HttpException && request()->isAjax()) {
                return response($e->getMessage(), $e->getStatusCode());
            }
            if ($e->getStatusCode() == 404) {
                $module = app('http')->getName();
                !$module and $module = 'index';
                return view($module . '@public/404');
            }
            if ($e->getStatusCode() == 500) {
                return parent::render($request, $e);
            }
        } else {
            $file          = $e->getFile();
            $line          = $e->getLine();
            $code          = parent::getCode($e);
            $message       = parent::getMessage($e);
            $error_message = '[' . $code . '] ErrorException in ' . $file . ' line ' . $line . PHP_EOL . $message;
            // 此处为钉钉server
            $server = new \app\Server\DingdingServer();
            $data   = [
                'text' => ['content' => $error_message],
            ];
            $server->robotSend($data);
        }
        // 其他错误交给系统处理
        return parent::render($request, $e);
    }

}

3:钉钉Server的创建

<?php

/**
 * 钉钉开放API
 * https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
 */

namespace app\Server;

class DingdingServer
{

    private $API_URL = "https://oapi.dingtalk.com/robot/send?access_token=xxxxx";

    public function __construct()
    {

    }

    /**
     * @param  array   $data
     * @param  string  $msgtype text  link markdown actionCard
     * @return boolean
     */
    public function robotSend($data = [], $msgtype = 'text')
    {
        if (empty($data)) {
            return false;
        }
        $final_data  = $data + ['msgtype' => $msgtype];
        $data_string = json_encode($final_data);
        $webhook     = $this->API_URL;
        $result      = $this->request_by_curl($webhook, $data_string);
        return $result;
    }

    protected function request_by_curl($remote_server, $post_string)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $remote_server);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json;
            charset = utf-8'));
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        // 线下环境不用开启curl证书验证, 未调通情况可尝试添加该代码
        // curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
        // curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $data = curl_exec($ch);
        curl_close($ch);

        return $data;
    }

}

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

1:先下载PC版钉钉

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

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

QQ截图20190402164830.png

QQ截图20190402164906.png

QQ截图20190402164936.png

4:钉钉API地址就在webhook中

QQ截图20190402165009.png


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


关于钉钉的API,代码中默认调用text文本形式,其实还有很多,例如 link markdown actionCard 方式,小伙伴们可以自行研究~


声明:版权所有,违者必究 | 如未注明,均为原创 | 本网站采用 BY-NC-SA 协议进行授权

转载:转载请注明原文链接,违者必究 - :https://www.wolfcode.net/info/179/

分享给朋友:

相关文章

EasyAdmin8 - PHP8.0常用框架快速后台管理系统

EasyAdmin8 开源快速开发后台,ThinKPHP 、 Laravel、webman 均覆盖

webman-blog 基于 webman 开源博客程序

webman-blog,一个基于 webman 的简单自适应个人博客程序,带后台。

webman自定义进程

1、新建文件 process/Rpc.php 编写rpc进程&lt;?php namespace&nbsp;process; use&nbsp;Workerman\Connection\TcpConnection; class&nbsp;Rpc { &nbsp;&nbsp;&nbsp;&n

在PHP7+下监控Memcached服务、性能、扇区等信息

PHPMemcachedAdmin:一款网页可视化的Memcached工具

Swoole的PHP协程开发框架 imi 集成ThinkPHP模板引擎 think-template

在 imi 框架根目录中执行composer&nbsp;require&nbsp;topthink/think-template安装好模板引擎后,找到路径\vendor\topthink\think-template\src\Template.php找到 fetch() 渲染模板文件的方法,将最后一

PHP7下MongoDB自增或自减一个字段的值

findAndModify属于原子操作模型数据,所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。

PHP的面向对象解析

早期编程由于受电脑硬件限制,程序都是追求效率,而忽略可理解性,扩充性,随着硬件技术的发展,编程越来越重视多人开发,程序员越来越重视程序的可靠性,可扩展性,可维护性,所以刺激了程序语言的发展

ThinkPHP6.0使用EasyTask常驻内存多进程任务管理

PHP常驻内存的多进程任务管理器Composer包。以进程管理为出发点,同时也支持为每个进程设置定时执行功能,您可以用它来完成需要重复运行的任务(如订单超时自动取消,短信邮件异步推送,队列/消费者/频道订阅者等等),甚至处理计划任务。

PHP8新特性盘点

PHP 8.0.0 已经正式发布了,这个对于PHPer无疑是一个令人振奋的消息。它包含了很多新功能与优化项, 包括命名参数、联合类型、注解、构造器属性提升、match表达式、nullsafe运算符、JIT,并改进了类型系统、错误处理、语法一致性。

PHP8新特性系列:构造器属性提升使用及注意事项

本篇主要说下PHP8构造器属性提升的用法,这个特性对于一些需要在构造器中设置或初始化一些类属性的时候非常有用(包括public、protected和private),比如在PHP7中你可以这样定义一个类的属性,然后在构造方法中传值。class&nbsp;Point&nbsp;{ &nbsp;&nb