ThinkPHP请求统计数据表创建完整代码示例

千敏小哥_3163

千敏小哥_3163

2026-08-18

305人浏览

原创

thinkphp 6 创建请求统计表的 migration 文件需用 php think migrate:create create_request_stats_table 生成,核心是声明 ip(string(45))、path、method、status_code、duration_ms 和 created_at(datetime,不加 usecurrent),并为高频查询字段添加索引。

thinkphp请求统计数据表创建完整代码示例

ThinkPHP 6 创建请求统计表的 migration 文件怎么写

直接用 php think migrate:create create_request_stats_table 生成迁移文件后,核心是正确声明字段:必须包含请求时间、IP、路径、方法、状态码、耗时,且时间字段用 datetime() 而非 timestamp()(避免时区自动转换干扰统计)。

常见错误是把 ip 设为 string(15) ——IPv6 地址最长 39 位,应设为 string(45);还有人漏掉索引,导致按日期或路径查慢得明显。

public function change(): void
{
    $this->schema->create('request_stats', function (Blueprint $table) {
        $table->id();
        $table->string('ip', 45)->index(); // IPv6 支持 + 查询加速
        $table->string('path', 255)->index();
        $table->string('method', 10)->index();
        $table->smallInteger('status_code');
        $table->integer('duration_ms')->unsigned(); // 毫秒级耗时,避免浮点
        $table->datetime('created_at'); // 不用 useCurrent(),日志写入时显式赋值更可控
        $table->index(['created_at', 'path']); // 复合索引,支撑「某天某接口」类查询
    });
}

如何在中间件里记录请求数据到 stats 表

不能在控制器里手动插入——漏掉异常中断的请求;也不能用 Db::insert() 硬写,要走模型或 QueryBuilder,确保事务和连接复用。关键点是:耗时必须用 microtime(true) 前后差值,且转成整数毫秒;path 要过滤掉带参数的 URL,只留路由路径(比如 /api/user/123 → /api/user/:id),否则统计会散列。

容易踩的坑:$request->ip() 在 Nginx 反代下默认拿不到真实 IP,得配 $request->realIP() 并确认 TRUSTED_PROXY 已设;另外别在 after() 钩子里写 DB 操作,TP6 的中间件 after 是同步执行但可能已关闭数据库连接。

  • 在中间件 handle() 开头记 start_time
  • 用 App::after() 或响应发送前的钩子做写入(推荐用 Response::send 事件监听)
  • 用 RequestStat::create([...]) 走模型,触发自动时间填充和类型转换

为什么不用日志文件而选数据库存统计

日志文件适合归档和调试,但实时聚合(比如「过去一小时每分钟 404 数量」)要靠外部工具解析,延迟高、难关联业务维度。数据库能直接 GROUP BY DATE_FORMAT(created_at, '%Y-%m-%d %H:%i'),配合定时任务跑轻量汇总表即可支撑后台图表。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载

不过要注意:高频写入(如每秒百次请求)会拖慢主库。实际部署时建议:

  • 用单独的从库或统计专用库(配置 db_stats 连接)
  • 批量写入:缓存 10 条再 Db::table()->insertAll(),而非每请求一次 insert()
  • 定期归档:每月初把上月数据 INSERT INTO request_stats_hist ... SELECT 后 DELETE

统计表字段要不要加 soft delete 或 user_id

不加。请求统计是只追加的审计类数据,deleted_at 字段徒增索引体积和判断成本;user_id 更不能直接加——未登录用户为空,且登录态可能在中间件之后才解析,强耦合会导致写入失败或 NULL 泛滥。

真要关联用户,应在业务层记录时通过上下文提取(如从 Token 解析出 ID),并额外建宽表(如 request_stats_enhanced)异步补全,主统计表保持轻量、稳定、不可变。

最常被忽略的是 created_at 的精度和时区一致性:确保 PHP date_default_timezone_set('Asia/Shanghai') 和 MySQL 的 time_zone 都对齐,否则凌晨报表会出现跨天偏移。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php thinkphp

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

10864

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6341

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2135

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4008

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4714

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3691

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5297

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4142

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12062

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习