範例解析thinkphp怎麼用中介軟體記錄行為紀錄檔

2022-05-18 13:00:17
本篇文章給大家帶來了關於的相關知識,其中主要根據範例來看一下使用中介軟體記錄行為紀錄檔的問題,包括了使用紀錄檔通道暫存行為紀錄檔、使用定時任務將紀錄檔內容定時寫入資料庫等,下面一起來看一下,希望對大家有幫助。

推薦學習:《》

一、定義中介軟體

可以通過命令列指令快速生成中介軟體

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
紀錄檔處理

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 ,註冊個行為紀錄檔全域性中介軟體

<?php// 全域性中介軟體定義檔案return [
    // 全域性請求快取
    // \think\middleware\CheckRequestCache::class,
    // 多語言載入
    // \think\middleware\LoadLangPack::class,
    // Session初始化
    // \think\middleware\SessionInit::class
    // 行為紀錄檔
    \app\middleware\Behavior::class,   ];

3.測試能否成功生成紀錄檔

隨便存取一個本計畫頁面,例如: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}"}


三、使用定時任務將紀錄檔內容定時寫入資料庫

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次

至此, 有使用者存取時,資料表就會每隔一段時間就批次插入行為紀錄檔資料了

推薦學習:《》

以上就是範例解析thinkphp怎麼用中介軟體記錄行為紀錄檔的詳細內容,更多請關注TW511.COM其它相關文章!