Rumah  >  Artikel  >  rangka kerja php  >  Contoh analisis: bagaimana thinkphp menggunakan middleware untuk merekod log tingkah laku

Contoh analisis: bagaimana thinkphp menggunakan middleware untuk merekod log tingkah laku

WBOY
WBOYke hadapan
2022-05-18 11:50:313784semak imbas

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.

Contoh analisis: bagaimana thinkphp menggunakan middleware untuk merekod log tingkah laku

Pembelajaran yang disyorkan: "Tutorial Video PHP"

1. Tentukan perisian tengah

Ya Cepat hasilkan perisian tengah melalui arahan baris arahan

php think make:middleware Behavior

Contoh analisis: bagaimana thinkphp menggunakan middleware untuk merekod log tingkah laku
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);
    }}

2. Gunakan saluran log untuk menyimpan sementara log tingkah laku

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

Ubah suai fail konfigurasi 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,    // 关闭实时写入
 ],

2 >

Buka app/middleware.php dan daftarkan Perisian tengah global log Gelagat individu

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,   ];

Lawati mana-mana halaman projek ini, contohnya: http://www.tp6.com/ index/index/test?a=1&b=2, lihat jika fail berikut boleh dijana


Buka fail, data telah ditulis Contoh analisis: bagaimana thinkphp menggunakan middleware untuk merekod log tingkah laku

{"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}"}

3 tulis kandungan log ke pangkalan data dengan kerap

1 Cipta kaedah api baharu, keperluan Tugas berjadual boleh diakses ke

2 Cipta jadual data log kelakuan baharu
 /**
     * 定时任务服务器定时将用户行为日志插入到数据库
     * @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;

Buat tugas berjadual baharu, akses berjadual langkah 1 Alamat sync_behavior_log sudah memadai, disyorkan untuk melakukannya sekali setiap 5 minit

Pada ketika ini, apabila pengguna mengakses, jadual data akan memasukkan data log tingkah laku secara kelompok sekali-sekala

Pembelajaran yang disyorkan: "

Tutorial video PHP

Atas 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!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam