实例解析thinkphp怎么用中间件记录行为日志

发布时间 - 2022-05-18 00:00:00    点击率:

本篇文章给大家带来了关于php的相关知识,其中主要根据示例来看一下使用中间件记录行为日志的问题,包括了使用日志通道暂存行为日志、使用定时任务将日志内容定时写入数据库等,下面一起来看一下,希望对大家有帮助。

推荐学习:《PHP视频教程》

一、定义中间件

可以通过命令行指令快速生成中间件

php think make:middleware Behavior


这个指令会 app/middleware目录下面生成一个Behavior中间件。内容如下:

method());
         $is_ajax = $request->isAjax();
         $route = $request->pathinfo();
         $req = $_REQUEST;
         unset($req['s'],$req['_session']);  
         $req_data = $req ?  json_encode($req) : '';
         $data = [
               'admin_id' => $admin['id'],				//操作人id
               'admin_user' => $admin['user'],			//操作人用户名
               'route' => $route,						//操作的路由地址
               'method' => $method,						//get/post
               'req_tp' => $is_ajax ? 'ajax' : 'normal',
               'req_data' => $req_data,   				 //get/post的数据
               'ip' => getIp(),
               'create_time' => time()
         ];
         //end
         return $next($request);
    }}

二、使用日志通道暂存行为日志

不建议将行为日志实时写入数据库给数据库造成不必要的压力. 我们先写入log文件缓存,定时存入数据库
提示:先阅读官方日志处理教程 https://www.kancloud.cn/manual/thinkphp6_0/1037616
日志处理

1.修改log配置文件

打开config/log.php ,在’channels’ => [] 最后加入一个记录行为日志的单独通道:
 // 其它日志通道配置
 //行为日志
 'behavior'    =>    [
     'path'           => runtime_path().'behavior',  //日志存放目录
     'type'    =>    'File',
     'single' =>     'b',        		//单一文件日志:文件名
     'file_size'   	=> 	1024*1024*10, 	//日志文件大小限制(超出会生成多个文件
     'max_files' => 30,                  //文件最大数量
     'realtime_write'    =>    false,    // 关闭实时写入
 ],

2.注册全局中间件

打开app/middleware.php ,注册个行为日志全局中间件

3.测试能否成功生成日志

随便访问一个本项目页面,例如:http://www.tp6.com/index/index/test?a=1&b=2,看能否生成以下文件.

打开文件,数据已写入

{“time”:“2025-04-16T21:38:48+08:00”,“type”:“info”,“msg”:"{“admin_id”:888,“admin_user”:“fanchen”,“route”:“index\/index\/test”,“method”:“get”,“req_tp”:“normal”,“req_data”:"{\“a\”:\“1\”,\“b\”:\“2\”}",“ip”:“127.0.0.1”,“create_time”:1650116328}"}


三、使用定时任务将日志内容定时写入数据库

1.新建一个api方法, 要求定时任务可以访问到

 /**
     * 定时任务服务器定时将用户行为日志插入到数据库
     * @return void
     */
    public function sync_behavior_log()
    {
        $path = runtime_path() . 'behavior/b.log';
        $b_file = file_get_contents($path);
        $b_arr = explode(PHP_EOL, $b_file);
        $d = [];
        foreach ($b_arr as $b) {
            $data = json_decode($b, true);
            if (!empty($data['msg'])) {
                $d[] = json_decode($data['msg'], true);
            }
        }
        if ($d) {
            try {
                Db::name('log_behavior')->insertAll($d);     //批量插入数据库
                file_put_contents($path, '');       //清空文件日志
                echo '采集用户行为日志成功' . count($d);
            } catch (DbException $e) {
                echo ($e->getMessage());
            }
        }
    }

2.新建行为日志数据表log_behavior

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for log_behavior
-- ----------------------------
DROP TABLE IF EXISTS `log_behavior`;
CREATE TABLE `log_behavior`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `admin_id` int(11) NOT NULL DEFAULT 0 COMMENT '用户id',
  `admin_user` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户名',
  `route` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '模块名称',
  `method` enum('delete','put','post','get') CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'get' COMMENT '请求方式 1get 2post 3put 4delete',
  `req_data` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '请求数据',
  `ip` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户ip',
  `create_time` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `uid`(`admin_id`) USING BTREE,
  INDEX `admin_user`(`admin_user`) USING BTREE,
  INDEX `route`(`route`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3902195 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '行为日志' ROW_FORMAT = Compact;

SET FOREIGN_KEY_CHECKS = 1;

3.新建定时任务

新建定时任务,定时访问步骤1的sync_behavior_log地址就行了, 建议5分钟1次

至此, 有用户访问时,数据表就会每隔一段时间就批量插入行为日志数据了

推荐学习:《PHP视频教程》


# thinkphp  # 就会  # 多个  # 可以通过  # 带来了  # 给大家  # 每隔  # 命令行  # 配置文件  # 时将  # 相关知识 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  如何在Tomcat中配置并部署网站项目?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Bootstrap整体框架之JavaScript插件架构  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  PythonWeb开发入门教程_Flask快速构建Web应用  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  北京网站制作公司哪家好一点,北京租房网站有哪些?  C语言设计一个闪闪的圣诞树  Android Socket接口实现即时通讯实例代码  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Laravel如何配置任务调度?(Cron Job示例)  如何在建站之星网店版论坛获取技术支持?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  中山网站推广排名,中山信息港登录入口?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  浅述节点的创建及常见功能的实现  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  JavaScript如何实现错误处理_try...catch如何捕获异常?  使用spring连接及操作mongodb3.0实例  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  JavaScript模板引擎Template.js使用详解  Python文件操作最佳实践_稳定性说明【指导】  javascript基本数据类型及类型检测常用方法小结  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  ,交易猫的商品怎么发布到网站上去?  Laravel怎么使用Intervention Image库处理图片上传和缩放  网站建设要注意的标准 促进网站用户好感度!  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  简历在线制作网站免费版,如何创建个人简历?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  如何在Windows虚拟主机上快速搭建网站?  如何安全更换建站之星模板并保留数据?  音响网站制作视频教程,隆霸音响官方网站?  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  如何在香港免费服务器上快速搭建网站?  详解Android——蓝牙技术 带你实现终端间数据传输  如何快速上传自定义模板至建站之星?  如何在宝塔面板中修改默认建站目录?