介绍
突然在宝塔中发现了一个非常不错的功能:
没错,这个就是宝塔的网站监控,这个功能可用直接统计网站的访问量信息,相对准确很多,网上提供的接口可能会因为请求问题导致记录数量丢失,而宝塔的网站监控就可以从根源上进行记录请求,但是这个功能虽然很好,可是没有提供接口给我们使用,于是我决定研究并开发出一个获取其数据的接口。
寻找数据存放位置
经过一番查找,我发现宝塔统计数据就存放在这里:
/www/server/total/logs/站点名称
观察数据结构
这个路径中,有一些.db
文件,这些就是存储了统计信息的数据文件。
其中用日期命名的是每天的访问记录,而我们需要的是总统计数据,所以需要total.db
这个文件
不难知道,这些是sqlite数据库的文件,我将total.db
文件下载下来,并通过软件打开。
数据表
于是发现这个数据库的结构是这样的
client_stat 客户端统计 用于记录访问过的客户端信息
ip_stat IP统计 用于记录访问过的IP地址
referer2_stat 来源统计 用于记录访问来源信息
request_stat 请求统计 用于记录请求
spider_stat 蜘蛛统计 用于记录蜘蛛(爬虫)请求
uri_stat URI统计 用于记录访问的URI信息
请求统计记录
其中我们需要用到请求统计,也就是request_stat
这个数据表,观察一下这个数据表
可以发现,数据表将每一天的各种请求信息记录了下来,那么我们只要通过一些简单的 代码 来读取并处理这些数据就可以实现这个接口了。
开始写代码
启用拓展
语言我选择了我最熟悉的后端语言 PHP 这个接口需要依赖sqlite3
拓展,并且我发现我本地开发环境中没有启用这个拓展,于是我先修改这个配置
这样就将sqlite3
拓展启用了,然后就可以开始写代码了。
这次是我第一次使用sqlite3这个功能,可能不是很了解,由于SQL
语句基本都相似,所以学习起来非常快。
加载db
首先要用PHP加载这个.db
文件
$db = new SQLite3("total.db");
这样就得到了一个类型为SQLite3的对象
注意:此时PHP文件和db
文件存储在同一个路径下。
读取数据
然后要从这个数据库中的request_stat
数据表中获取数据
$result = $db->query("select * from request_stat");
这样就获得了执行结果
错误分析
如果执行出现了错误,将会直接输出内容,并且query()
方法会返回bool(false)
,我们可以对结果进行判断
if (!$result){
printf("执行失败了,原因是:%s", $db->lastErrorMsg());
die();
}
其中lastErrorMsg()
方法在执行失败时会存储最后一次的错误信息,可以通过这个内容进行修改问题。
如果没有报错,那么目前的操作非常顺利,我们就可以对数据进行处理了。
处理数据
首先要创建一个数组用于存储信息
$data = [
"pv"=>0,
"uv"=>0,
"ip"=>0,
"req"=>0,
"length"=>0
];
并将其所有键值都初始化为0,然后进行读取
while($row=$result->fetchArray(SQLITE3_ASSOC)){
foreach (array_keys($data) as $k) {
$data[$k]+=$row[$k];
}
}
首先写上一个while循环,条件就是使用$result->fetchArray()
方法一直读取结果中的数据并转换成一行数据$row
,直到所有行读完,这个方法和mysqli_fetch_assoc()``非常相似,随后根据对应的键获取数据累加到
$data`中的对应位置。
返回数据
最后,我们只要将$data
这个数组中的数据反馈出来就可以了
echo json_encode($data);
实例
同时,我编写了一个小实例,效果如下:
现在,我开放这个小实例的下载
接口实例下载
清北网盘下载:https://pan.tsinbei.com/s/APCk
蓝奏云下载:https://schlibra.lanzouo.com/ie1ya0ljeerg
123云盘下载:https://www.123pan.com/s/xE9lVv-mISKd
提取码:4735
结尾
这篇教程到这里就结束了,感谢您的阅读,希望对您有帮助。: )
评论区