Maison  >  Article  >  cadre php  >  Exemple d'analyse : comment thinkphp utilise un middleware pour enregistrer les journaux de comportement

Exemple d'analyse : comment thinkphp utilise un middleware pour enregistrer les journaux de comportement

WBOY
WBOYavant
2022-05-18 11:50:313768parcourir

Cet article vous apporte des connaissances pertinentes sur PHP. Il examine principalement le problème de l'utilisation d'un middleware pour enregistrer les journaux de comportement sur la base d'exemples, notamment l'utilisation de canaux de journalisation pour stocker temporairement les journaux de comportement et l'utilisation de tâches planifiées pour chronométrer le contenu des journaux. base de données, etc. Jetons-y un coup d'œil, j'espère que cela sera utile à tout le monde.

Exemple d'analyse : comment thinkphp utilise un middleware pour enregistrer les journaux de comportement

Apprentissage recommandé : "Tutoriel vidéo PHP"

1. Définir un middleware

Vous pouvez générer rapidement un middleware via des instructions de ligne de commande

php think make:middleware Behavior

Exemple danalyse : comment thinkphp utilise un middleware pour enregistrer les journaux de comportement
Cette commande générera un comportement dans le répertoire app/middleware. middleware. Le contenu est le suivant :

<?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);
    }}

2. Utilisez le canal de journalisation pour stocker temporairement les journaux de comportement

Il n'est pas recommandé d'écrire des journaux de comportement dans la base de données en temps réel, ce qui entraînerait une pression inutile sur la base de données. cache du fichier journal et enregistrez-le régulièrement dans la base de données
提示:先阅读官方日志处理教程 https://www.kancloud.cn/manual/thinkphp6_0/1037616
Traitement du journal

1 Modifiez le fichier de configuration du journal

Ouvrez config/log.php, dans 'channels' => [] et enfin ajoutez un canal séparé pour l'enregistrement. journaux de comportement :

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

2. Enregistrez le middleware global

Ouvrez app/middleware.php et enregistrez un middleware global du journal de comportement

<?php // 全局中间件定义文件return [
    // 全局请求缓存
    // \think\middleware\CheckRequestCache::class,
    // 多语言加载
    // \think\middleware\LoadLangPack::class,
    // Session初始化
    // \think\middleware\SessionInit::class
    // 行为日志
    \app\middleware\Behavior::class,   ];

3. Testez si le journal peut être généré avec succès

Visitez n'importe quelle page de ce projet. , par exemple : http://www.tp6.com/index/ index/test?a=1&b=2, voyez si le fichier suivant peut être généré
Exemple danalyse : comment thinkphp utilise un middleware pour enregistrer les journaux de comportement
Ouvrez le fichier, les données ont été écrites

. {"time": "2022-04-16T21: 38: 48 + 08: 00" , "type": "info", "msg": {"admin_id": 888, "admin_user": "fanchen", route": "index/index/test", "méthode": "get", "req_tp": "normal", "req_data": "{"a": "1", "b": "2"}" ,"ip":"127.0.0.1","create_time":1650116328}"}


3. Utilisez des tâches planifiées pour écrire régulièrement le contenu du journal dans la base de données

1. Créez une nouvelle méthode API qui nécessite des tâches planifiées pour être accessible

 /**
     * 定时任务服务器定时将用户行为日志插入到数据库
     * @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. Créez une nouvelle table de données de journal de comportement 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. Créez une nouvelle tâche planifiée

Créez une nouvelle tâche planifiée et accédez régulièrement à l'adresse sync_behavior_log à l'étape 1. Il est recommandé de le faire une fois par mois. 5 minutes

À ce stade, lorsqu'un utilisateur accède à la table de données, les données du journal de comportement seront insérées par lots à intervalles réguliers

Apprentissage recommandé : " Tutoriel vidéo PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer