介绍

突然在宝塔中发现了一个非常不错的功能:

宝塔网站统计

没错,这个就是宝塔的网站监控,这个功能可用直接统计网站的访问量信息,相对准确很多,网上提供的接口可能会因为请求问题导致记录数量丢失,而宝塔的网站监控就可以从根源上进行记录请求,但是这个功能虽然很好,可是没有提供接口给我们使用,于是我决定研究并开发出一个获取其数据的接口。

寻找数据存放位置

经过一番查找,我发现宝塔统计数据就存放在这里:

统计数据存放路径

/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拓展,并且我发现我本地开发环境中没有启用这个拓展,于是我先修改这个配置

修改PHP配置

这样就将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

结尾

这篇教程到这里就结束了,感谢您的阅读,希望对您有帮助。: )