この記事では、PHP に関する関連知識を提供します。主に、ログ チャネルを使用して動作ログを一時的に保存する、スケジュールされたタスクを使用して定期的に書き込みを行うなど、例に基づいてミドルウェアを使用して動作ログを記録する問題について説明します。内容をデータベースに記録するなど、皆さんの参考になれば幸いです。
##推奨学習: 「PHP ビデオ チュートリアル 」
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); }}
ヒント: 最初に公式のログ処理チュートリアルをお読みください https://www.kancloud.cn/manual/thinkphp6_0/1037616ログ処理
config/log.phpを開き、「channels」の最後に動作ログを記録するための別のチャネルを追加します => [] :2. グローバルミドルウェアの登録// 其它日志通道配置 //行为日志 'behavior' => [ 'path' => runtime_path().'behavior', //日志存放目录 'type' => 'File', 'single' => 'b', //单一文件日志:文件名 'file_size' => 1024*1024*10, //日志文件大小限制(超出会生成多个文件 'max_files' => 30, //文件最大数量 'realtime_write' => false, // 关闭实时写入 ],ログイン後にコピー
app/middleware.php を開き、動作ログのグローバルミドルウェア3を登録します。ログが正常に生成されるかどうかをテストしますこのプロジェクトの任意のページ (例: http://www.tp6.com/index/index/test?a=1&b=2) にアクセスして、<?php // 全局中间件定义文件return [ // 全局请求缓存 // \think\middleware\CheckRequestCache::class, // 多语言加载 // \think\middleware\LoadLangPack::class, // Session初始化 // \think\middleware\SessionInit::class // 行为日志 \app\middleware\Behavior::class, ];ログイン後にコピー
ファイルを開くと、データが書き込まれています。
{"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;
PHP ビデオ チュートリアル 」
以上が分析例: thinkphp がミドルウェアを使用して動作ログを記録する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。