logo
0
0
WeChat Login

NewAPI Monitor - 大模型 Token 消耗统计面板

一个轻量级的 PHP 统计面板,用于监控和可视化 NewAPI 平台的大模型 Token 消耗情况,支持按小时聚合的 Token 统计和模型排行榜。

功能特性

  • Token 消耗统计 — 按小时聚合展示输入/输出 Token 的堆叠柱状图
  • 模型排行榜 — 按总 Token 消耗排名,展示调用次数、平均响应时间等
  • 用户排行榜 — 按用户统计 Token 消耗排名,支持用户名脱敏
  • 时间范围筛选 — 支持 1/3/7/14/30 天数据查询
  • 文件缓存 — 基于文件系统的 JSON 缓存,减少数据库压力
  • 响应式设计 — 适配桌面端和移动端,移动端自动切换为卡片布局
  • API 接口 — 提供 JSON 格式的 API 端点,方便集成
  • 环境变量配置 — 通过 .env 文件控制功能开关

项目结构

newapi-monitor/ ├── index.php # 主页面(统计面板) ├── api.php # JSON API 端点 ├── config.php # 数据库与缓存配置 ├── functions.php # 公共函数库 ├── .env # 环境变量配置 ├── .env.example # 环境变量模板 ├── cache/ # 缓存目录(自动创建) │ └── .htaccess # 禁止直接访问缓存文件 └── .htaccess # Apache 安全配置

环境要求

  • PHP 7.0+(需开启 mysqli 扩展)
  • MySQL 5.7+ / MariaDB 10.2+
  • Apache(需启用 mod_headers、mod_rewrite)或 Nginx
  • 浏览器需支持 ES6

数据库要求

项目需连接 NewAPI 的数据库,依赖 newapi.logs 表,以下字段:

字段说明
created_atUNIX 时间戳
model_name模型名称
username用户名
prompt_tokens输入 Token 数
completion_tokens输出 Token 数
use_time响应时间(ms)

安装部署

  1. 克隆项目

    git clone <your-repo-url> /var/www/newapi-monitor cd /var/www/newapi-monitor
  2. 修改配置

    编辑 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
  3. 设置权限

    chmod 755 cache/ chown -R www-data:www-data .
  4. 配置 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; } }
  5. 访问面板

    打开浏览器访问:http://your-domain/newapi-monitor/

API 使用

端点

GET /api.php

参数

参数说明默认值
type统计类型:token / model / user / summarytoken
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分钟)

.env 环境变量

配置项说明默认值
USER_RANKING_ENABLED是否显示用户排行榜true
USER_RANKING_MASK是否对用户名脱敏(中间用 * 替代)false

脱敏规则:保留首尾字符,中间替换为 *。如 张三张*zhangsanz******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-OptionsX-Frame-OptionsReferrer-Policy

待改进建议

优先级建议
添加认证机制,防止未授权访问统计数据
为 CDN 资源(Chart.js)添加 SRI 完整性校验
nocache 参数增加频率限制 ✅ 已实施:基于 IP 的 60 秒频率限制
config.php 移到 Web 根目录之外
收紧 CORS 策略,将 Access-Control-Allow-Origin: * 改为指定域名
添加 Content-Security-Policy
考虑使用环境变量替代硬编码的数据库凭据

技术栈

  • 后端:PHP + MySQL (mysqli)
  • 前端:原生 HTML/CSS/JavaScript + Chart.js 4.4
  • 缓存:文件系统 JSON 缓存

License

MIT

About

No description, topics, or website provided.
Language
PHP100%