一个轻量级的 PHP 统计面板,用于监控和可视化 NewAPI 平台的大模型 Token 消耗情况,支持按小时聚合的 Token 统计和模型排行榜。
.env 文件控制功能开关newapi-monitor/ ├── index.php # 主页面(统计面板) ├── api.php # JSON API 端点 ├── config.php # 数据库与缓存配置 ├── functions.php # 公共函数库 ├── .env # 环境变量配置 ├── .env.example # 环境变量模板 ├── cache/ # 缓存目录(自动创建) │ └── .htaccess # 禁止直接访问缓存文件 └── .htaccess # Apache 安全配置
项目需连接 NewAPI 的数据库,依赖 newapi.logs 表,以下字段:
| 字段 | 说明 |
|---|---|
created_at | UNIX 时间戳 |
model_name | 模型名称 |
username | 用户名 |
prompt_tokens | 输入 Token 数 |
completion_tokens | 输出 Token 数 |
use_time | 响应时间(ms) |
克隆项目
git clone <your-repo-url> /var/www/newapi-monitor
cd /var/www/newapi-monitor
修改配置
编辑 config.php,填入你的数据库连接信息:
$db_host = 'localhost';
$db_user = 'your_db_user';
$db_pass = 'your_db_password';
$db_name = 'newapi';
复制 .env.example 为 .env,根据需要调整功能开关:
cp .env.example .env
设置权限
chmod 755 cache/
chown -R www-data:www-data .
配置 Web 服务器
Apache:项目已包含 .htaccess,确保已启用 AllowOverride All。
Nginx:添加以下配置:
location /newapi-monitor { index index.php; try_files $uri $uri/ /index.php?$query_string; # 禁止访问 config.php location ~ /config\.php$ { return 403; } # 禁止访问缓存目录 location /newapi-monitor/cache/ { return 403; } # 禁止访问 .git / .env location ~ /\.(git|env) { return 403; } }
访问面板
打开浏览器访问:http://your-domain/newapi-monitor/
GET /api.php
| 参数 | 说明 | 默认值 |
|---|---|---|
type | 统计类型:token / model / user / summary | token |
days | 时间范围:1-30 天 | 7 |
nocache | 强制刷新缓存:1 | - |
# 获取最近7天的 Token 统计
curl "http://your-domain/api.php?type=token&days=7"
# 获取模型排行榜(最近3天)
curl "http://your-domain/api.php?type=model&days=3"
# 获取用户排行榜(最近7天)
curl "http://your-domain/api.php?type=user&days=7"
# 获取汇总统计(强制刷新)
curl "http://your-domain/api.php?type=summary&days=7&nocache=1"
{
"success": true,
"data": [...],
"from_cache": false,
"days": 7,
"generated_at": "2026-04-24 01:00:00"
}
config.php 中的可配置项:
| 配置项 | 说明 | 默认值 |
|---|---|---|
db.host | 数据库主机 | localhost |
db.user | 数据库用户 | newapi |
db.pass | 数据库密码 | newapi |
db.name | 数据库名称 | newapi |
cache.dir | 缓存目录 | ./cache |
cache.ttl | 缓存有效期(秒) | 1800(30分钟) |
| 配置项 | 说明 | 默认值 |
|---|---|---|
USER_RANKING_ENABLED | 是否显示用户排行榜 | true |
USER_RANKING_MASK | 是否对用户名脱敏(中间用 * 替代) | false |
脱敏规则:保留首尾字符,中间替换为
*。如张三→张*,zhangsan→z******n。
为确保查询性能,建议为 newapi.logs 表添加以下索引:
-- 核心索引:加速时间范围查询
ALTER TABLE newapi.logs ADD INDEX idx_created_at (created_at);
-- 复合索引:同时加速按时间+模型的聚合查询
ALTER TABLE newapi.logs ADD INDEX idx_created_model (created_at, model_name);
-- 用户排行索引:加速按用户聚合查询
ALTER TABLE newapi.logs ADD INDEX idx_created_username (created_at, username);
如果
logs表数据量超过百万级,建议额外创建按小时预聚合的汇总表,通过定时任务每小时更新,查询汇总表而非原始日志表,可大幅降低数据库负载。
| 项目 | 说明 |
|---|---|
| SQL 注入 | 所有 SQL 查询均使用预处理语句(prepare + bind_param),参数 $days 通过 sanitizeDays() 强制转为整数 |
| 问题 | 修复措施 |
|---|---|
| XSS($type 嵌入 JS) | 对 $type 增加白名单校验,JS 输出改用 json_encode() |
| 缓存目录可被直接访问 | 添加 cache/.htaccess 禁止访问 |
| config.php 可被直接访问 | 添加 .htaccess 规则拒绝访问 |
| 数据库连接未关闭 | token 查询后补充 $conn->close() |
| 缺少安全响应头 | 添加 X-Content-Type-Options、X-Frame-Options、Referrer-Policy |
| 优先级 | 建议 |
|---|---|
| 高 | 添加认证机制,防止未授权访问统计数据 |
| 中 | 为 CDN 资源(Chart.js)添加 SRI 完整性校验 |
| 中 | nocache 参数增加频率限制 |
| 中 | 将 config.php 移到 Web 根目录之外 |
| 低 | 收紧 CORS 策略,将 Access-Control-Allow-Origin: * 改为指定域名 |
| 低 | 添加 Content-Security-Policy 头 |
| 低 | 考虑使用环境变量替代硬编码的数据库凭据 |
MIT