찾다
PHP 프레임워크ThinkPHP분석 예: thinkphp가 미들웨어를 사용하여 행동 로그를 기록하는 방법

이 글에서는 PHP에 대한 관련 지식을 제공합니다. 로그 채널을 사용하여 동작 로그를 임시로 저장하고 예약된 작업을 사용하여 로그 콘텐츠에 기록하는 등 예제를 기반으로 미들웨어를 사용하여 동작 로그를 기록하는 문제를 주로 살펴봅니다. 데이터베이스 등을 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.

분석 예: thinkphp가 미들웨어를 사용하여 행동 로그를 기록하는 방법

추천 학습: "PHP 비디오 튜토리얼"

1. 미들웨어 정의

명령줄 지침을 통해 빠르게 미들웨어를 생성할 수 있습니다.

php think make:middleware Behavior

분석 예: thinkphp가 미들웨어를 사용하여 행동 로그를 기록하는 방법
이 명령은 app/middleware 디렉토리에 동작을 생성합니다. 미들웨어. 내용은 다음과 같습니다.

<?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. 로그 채널을 사용하여 행동 로그를 임시 저장합니다

행동 로그를 데이터베이스에 실시간으로 기록하는 것은 권장되지 않습니다. 이는 데이터베이스에 불필요한 부담을 줄 수 있습니다. 로그 파일 캐시를 정기적으로 데이터베이스에 저장합니다.
提示:先阅读官方日志处理教程 https://www.kancloud.cn/manual/thinkphp6_0/1037616
로그 처리

1. 로그 구성 파일을 수정합니다

config/log.php를 '채널' => []에서 열고 마지막으로 녹음을 위한 별도의 채널을 추가합니다. 행동 로그:

 // 其它日志通道配置
 //行为日志
 '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, 다음 파일이 생성될 수 있는지 확인하세요.
분석 예: thinkphp가 미들웨어를 사용하여 행동 로그를 기록하는 방법
파일을 열면 데이터가 기록되었습니다

{"time":"2022-04-16T21:38:48+08:00" ,"type":"info","msg":"{"admin_id":888,"admin_user":"fanchen"," 경로":"색인/색인/테스트","방법":"get"," req_tp":"normal","req_data":"{"a":"1","b":"2"}" ,"ip":"127.0.0.1","create_time":1650116328}"}


3. 예약된 작업을 사용하여 정기적으로 데이터베이스에 로그 콘텐츠를 씁니다

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분마다

이 시점에서 사용자가 데이터 테이블에 접근하면 행동 로그 데이터가 일정한 간격으로 일괄 삽입됩니다.

추천 학습: " PHP 비디오 튜토리얼

위 내용은 분석 예: thinkphp가 미들웨어를 사용하여 행동 로그를 기록하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 CSDN에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

WebStorm Mac 버전

WebStorm Mac 버전

유용한 JavaScript 개발 도구

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음