实例解析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——蓝牙技术 带你实现终端间数据传输 如何快速上传自定义模板至建站之星? 如何在宝塔面板中修改默认建站目录?

