Rumah > Artikel > rangka kerja php > Contoh analisis: bagaimana thinkphp menggunakan middleware untuk merekod log tingkah laku
Artikel ini membawakan anda pengetahuan yang berkaitan tentang PHP terutamanya melihat masalah penggunaan perisian tengah untuk merekod log tingkah laku berdasarkan contoh, termasuk menggunakan saluran log untuk menyimpan log tingkah laku buat sementara waktu dan menggunakan tugas Berjadual dengan kerap menulis. log kandungan ke pangkalan data, dsb. Mari kita lihat bersama-sama saya harap ia akan membantu semua orang.
Pembelajaran yang disyorkan: "Tutorial Video PHP"
Ya Cepat hasilkan perisian tengah melalui arahan baris arahan
php think make:middleware Behavior
Perintah ini akan menjana perisian tengah Gelagat di bawah direktori apl/perisian tengah. Kandungannya adalah seperti berikut:
<?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); }}
Ia tidak disyorkan untuk menulis log tingkah laku ke pangkalan data dalam masa nyata, yang akan menyebabkan tekanan yang tidak perlu pada pangkalan data. Mari kita tulis fail log terlebih dahulu Caching, disimpan secara kerap dalam pangkalan data 提示:先阅读官方日志处理教程 https://www.kancloud.cn/manual/thinkphp6_0/1037616
Pemprosesan log
Buka config/log.php, dalam 'channels' = > Akhir sekali tambahkan saluran berasingan untuk merekodkan log tingkah laku:
// 其它日志通道配置 //行为日志 'behavior' => [ 'path' => runtime_path().'behavior', //日志存放目录 'type' => 'File', 'single' => 'b', //单一文件日志:文件名 'file_size' => 1024*1024*10, //日志文件大小限制(超出会生成多个文件 'max_files' => 30, //文件最大数量 'realtime_write' => false, // 关闭实时写入 ],
3 Uji sama ada log boleh berjaya dijana
<?php // 全局中间件定义文件return [ // 全局请求缓存 // \think\middleware\CheckRequestCache::class, // 多语言加载 // \think\middleware\LoadLangPack::class, // Session初始化 // \think\middleware\SessionInit::class // 行为日志 \app\middleware\Behavior::class, ];
Buka fail, data telah ditulis
3 tulis kandungan log ke pangkalan data dengan kerap
/** * 定时任务服务器定时将用户行为日志插入到数据库 * @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()); } } }3. Buat tugasan berjadual baharu
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;
Pada ketika ini, apabila pengguna mengakses, jadual data akan memasukkan data log tingkah laku secara kelompok sekali-sekala
Pembelajaran yang disyorkan: "
Tutorial video PHPAtas ialah kandungan terperinci Contoh analisis: bagaimana thinkphp menggunakan middleware untuk merekod log tingkah laku. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!