php调用接口时将请求和响应信息写入日志表中

有三个方法

  1. 发送请求 中间处理
  2. curl请求
  3. 写入/修改日志

直接上代码


	/**
     * 发送请求 中间处理
     * @param string $name       方法名/动作类型
     * @param string $method     请求方法
     * @param string $data        请求/响应数据
     * @param array $edit_log    需要修改的日志数据
     * @param int $log_id        日志ID
     * @param int $is_add        默认为添加日志,为0 则修改日志
     * @param int $needToken     false:平台 true:用户
     * @param bool $globalToken  是否生成全局Token
     * @param bool $returnStream 是否生成流文件
     * @param int $headers       header头格式
     * @return array
     * @throws \think\db\exception\DbException
     */
    private static function handle( $name = '', $method = 'POST', $data = '', $edit_log = [], $log_id = 0, $is_add = 1, $needToken = 1, $globalToken = true, $returnStream = false, $headers = 0, $is_json = false)
    {
        if ( !$is_json)
        {
            $data = json_encode( $data, JSON_UNESCAPED_UNICODE);
        }

        // 修改日志信息
        if( !$is_add && !empty( $edit_log) && !in_array( $name, self::$no_log)) {
            $log_data = [
                'response'  => $data,
                'res_date'  => date( 'Y-m-d H:i:s')
            ];

            $new_log = array_merge( $log_data, $edit_log);
            self::log( $new_log, $log_id);

            return [];
        }

        // 写入日志
        if( $is_add &&  !in_array( $name, self::$no_log))
        {
            $log_data = [
                'action'        => $name,
                'action_turn'   => self::$action_turn[$name],
                'ip'            => get_ip(),
                'success'       => 0,
                'request'       => $data,
                'req_date'      => date( 'Y-m-d H:i:s'),
                'create_date'   => date( 'Y-m-d H:i:s'),
            ];
            $log_id = self::log( $log_data);
        }

        // 发送请求
        $result = self::curl_https( $name, $method, $data, $needToken, $globalToken, $returnStream, $headers);

        // 处理响应结果
        if( $result['code'] == '200')
        {
            // 成功
            $log = [ 'success' => 1];

        }
        else
        {
            // 失败
            $log = [ 'success' => 0];

        }

        return [
            // 响应数据
            'response'  => $result,
            // 日志ID
            'log_id'    => $log_id,
            // 需要修改的日志数据
            'log_data'  => $log
        ];

    }

	/**
     * curl请求
     * @param $name string 接口名称
     * @param $method string 请求方法
     * @param $data string|array 请求数据
     * @param int $needToken  false:平台 true:用户
     * @param bool $globalToken 是否生成全局Token
     * @param bool $returnStream 是否生成流文件
     * @param int $headers header头格式
     * @return array
     * @throws Exception
     */
    private static function curl_https( $name, $method, $data, $needToken = 1, $globalToken = true, $returnStream = false, $headers = 0)
    {
        $curl = curl_init();
        
        $url = config( 'logg.' . $name);

        if( $headers)
        {
            $header[0] = 'multipart/form-data;charset:UTF-8';
        }
        else
        {
            $header[0] = 'Content-type:application/json;charset:UTF-8';
        }

        if ($needToken == 1) {
            if (self::$token_valid <= time())
            {
                self::getToken();
            }

            $header[1] = "token:" . self::$token;
        }

        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
        switch ($method) {
            case 'GET':
                curl_setopt($curl, CURLOPT_HTTPGET, true);
                break;
            case 'POST':
                curl_setopt($curl, CURLOPT_POST, 1);
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                break;
            case 'PUT':
                curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                break;
            case 'PATCH':
                curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH');
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                break;
            case 'DELETE':
                curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
                break;
        }

        curl_setopt($curl, CURLOPT_TIMEOUT, 30);
        curl_setopt($curl, CURLOPT_HEADER, 1);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

        $response = curl_exec($curl);

        if (curl_errno($curl)) {
            echo 'Errno' . curl_error($curl);
        }

        if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == '200')
        {
            $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
            $header     = substr($response, 0, $headerSize);
            $body       = substr($response, $headerSize);
            $filename = urlencode('pdf文档') . '.pdf';
            if ( $returnStream) {
                header('Content-Type: application/pdf');
                header("Content-disposition: attachment; filename=$filename");
                echo $body;exit;
            }
        }
        else
        {
            $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
            $body       = substr($response, $headerSize);
            $body       = json_decode($body, true);

            throw new logException( [ 'msg' => $body['message'], 'errorCode' => $body['status']]);
        }

        $bodyObj = json_decode($body, true);

        curl_close($curl);

        if ($bodyObj['code'] == 200) {
            $arr = [];
            if (preg_match('/token:(.*)/', $header, $arr)) {
                if ($globalToken) {
                    self::$token       = trim($arr[1]);
                    self::$token_valid = time() + 15 * 60;
                } else {
                    $bodyObj['signerToken'] = trim($arr[1]);
                }
            }
        }
        return $bodyObj;
    }

	/**
     * 写入日志
     * @param array $data 数据
     * @param int $id     日志表主键
     * @return int|string
     * @throws \think\db\exception\DbException
     */
    private static function log( $data, $id = 0)
    {
        if( !$id)
        {
            $result =  Db::name( 'log')->insertGetId( $data);
        }
        else
        {
            $result = Db::name( 'log')->where( 'id', $id)->update( $data);
        }

        return $result;
    }

调用

$result = self::handle( 'create_person', 'POST', ([
            'userName'          => $username,
        ]));

        self::handle( '', '', $result['response'], $result['log_data'], $result['log_id'], 0);

        return $result['response'];

CREATE TABLE `log` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `action` varchar(100) DEFAULT '' COMMENT '动作类型',
  `action_turn` varchar(100) DEFAULT '' COMMENT '转换后的动作类型',
  `ip` varchar(20) DEFAULT '' COMMENT '请求IP',
  `success` tinyint(1) NOT NULL DEFAULT '0' COMMENT '响应成功/失败 [0:失败,1:成功]',
  `status` tinyint(1) DEFAULT '1' COMMENT '状态[1 发送中, 2 已发送]',
  `request` longtext COMMENT '请求的内容',
  `response` longtext COMMENT '响应的内容',
  `req_date` timestamp NULL DEFAULT NULL COMMENT '请求时间',
  `res_date` timestamp NULL DEFAULT NULL COMMENT '响应时间',
  `create_date` timestamp NULL DEFAULT NULL COMMENT '添加时间',
  `delete_time` int(11) DEFAULT '0' COMMENT '删除时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `success` (`success`) USING BTREE,
  KEY `status` (`status`) USING BTREE,
  KEY `req_time` (`req_date`) USING BTREE,
  KEY `res_time` (`res_date`) USING BTREE,
  KEY `action` (`action`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='日志表';
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值