推薦學習:《》
可以通過命令列指令快速生成中介軟體
php think make:middleware Behavior
這個指令會 app/middleware目錄下面生成一個Behavior中介軟體。內容如下:
<?phpdeclare (strict_types = 1);namespace app\middleware;use think\facade\Log;class Behavior{ /** * 處理請求 * * @param \think\Request $request * @param \Closure $next * @return Response */ public function handle($request, \Closure $next) { //start 加入以下內容 $admin = get_admin_info(); //當前登入使用者的資訊,自己實現 $method = strtolower($request->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
紀錄檔處理
開啟config/log.php ,在’channels’ => [] 最後加入一個記錄行為紀錄檔的單獨通道:
// 其它紀錄檔通道設定 //行為紀錄檔 'behavior' => [ 'path' => runtime_path().'behavior', //紀錄檔存放目錄 'type' => 'File', 'single' => 'b', //單一檔案紀錄檔:檔名 'file_size' => 1024*1024*10, //紀錄檔檔案大小限制(超出會生成多個檔案 'max_files' => 30, //檔案最大數量 'realtime_write' => false, // 關閉實時寫入 ],
開啟app/middleware.php ,註冊個行為紀錄檔全域性中介軟體
<?php// 全域性中介軟體定義檔案return [ // 全域性請求快取 // \think\middleware\CheckRequestCache::class, // 多語言載入 // \think\middleware\LoadLangPack::class, // Session初始化 // \think\middleware\SessionInit::class // 行為紀錄檔 \app\middleware\Behavior::class, ];
隨便存取一個本計畫頁面,例如:http://www.tp6.com/index/index/test?a=1&b=2,看能否生成以下檔案.
開啟檔案,資料已寫入
{「time」:「2022-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}"}
/** * 定時任務伺服器定時將使用者行為紀錄檔插入到資料庫 * @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()); } } }
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;
新建定時任務,定時存取步驟1的sync_behavior_log地址就行了, 建議5分鐘1次
至此, 有使用者存取時,資料表就會每隔一段時間就批次插入行為紀錄檔資料了
推薦學習:《》
以上就是範例解析thinkphp怎麼用中介軟體記錄行為紀錄檔的詳細內容,更多請關注TW511.COM其它相關文章!