前言
之前为随机图写了统计功能,闲着没事将live2d_api看了看,为其也添加了调用次数统计功能。
代码
统计功能部分。
<?php
class RedisCounter {
private $redis;
public function __construct($host = '127.0.0.1', $port = 6379, $password = '', $dbIndex = 0) {
$this->redis = new Redis();
try {
$this->redis->connect($host, $port);
if ($password) {
$this->redis->auth($password); // 设置密码
}
$this->redis->select($dbIndex); // 选择数据库
} catch (Exception $e) {
exit('Redis连接失败: ' . $e->getMessage());
}
}
/**
* 增加统计次数
*
* @param string $key Redis 的键
* @return int 当前调用次数
*/
public function increment($key) {
return $this->redis->incr($key);
}
/**
* 获取当前统计值
*
* @param string $key Redis 的键
* @return int 调用次数
*/
public function get($key) {
return (int) $this->redis->get($key);
}
/**
* 获取所有统计数据
*
* @param string $pattern 匹配"request_count:*"
* @return array 返回所有键值对
*/
public function getAll($pattern = 'request_count:*') {
$keys = $this->redis->keys($pattern);
$data = [];
foreach ($keys as $key) {
$data[str_replace('request_count:', '', $key)] = $this->get($key);
}
return $data;
}
}
返回统计数据部分,供前端使用。
<?php
require './redisCounter.php';
// 初始化 RedisCounter
$redisCounter = new RedisCounter(
'127.0.0.1', // Redis 主机
6379, // Redis 端口
'123456', // Redis 密码
0 // Redis 数据库索引
);
// 获取统计数据
try {
$stats = $redisCounter->getAll();
// 对键按数字部分排序
uksort($stats, function ($a, $b) {
// 分别提取键中的数字部分(键格式为 "数字-数字")
$partsA = array_map('intval', explode('-', $a));
$partsB = array_map('intval', explode('-', $b));
// 先比较第一部分,再比较第二部分
if ($partsA[0] === $partsB[0]) {
return $partsA[1] <=> $partsB[1];
}
return $partsA[0] <=> $partsB[0];
});
header('Content-Type: application/json');
echo json_encode($stats);
} catch (Exception $e) {
header('Content-Type: application/json');
echo json_encode(['error' => $e->getMessage()]);
}
get代码
<?php
// 引入工具文件
require '../tools/redisCounter.php';
require '../tools/modelList.php';
require '../tools/modelTextures.php';
require '../tools/jsonCompatible.php';
// 初始化 RedisCounter
$redisCounter = new RedisCounter(
'', // Redis 主机
6379, // Redis 端口
'', // Redis 密码
4 // Redis 数据库索引
);
// 获取 ID 参数
isset($_GET['id']) ? $id = $_GET['id'] : exit('error');
// 调用次数统计
$redisKey = "request_count:" . $id;
$redisCounter->increment($redisKey);
$modelList = new modelList();
$modelTextures = new modelTextures();
$jsonCompatible = new jsonCompatible();
$id = explode('-', $id);
$modelId = (int)$id[0];
$modelTexturesId = isset($id[1]) ? (int)$id[1] : 0;
$modelName = $modelList->id_to_name($modelId);
if (is_array($modelName)) {
$modelName = $modelTexturesId > 0 ? $modelName[$modelTexturesId-1] : $modelName[0];
$json = json_decode(file_get_contents('../model/'.$modelName.'/index.json'), 1);
} else {
$json = json_decode(file_get_contents('../model/'.$modelName.'/index.json'), 1);
if ($modelTexturesId > 0) {
$modelTexturesName = $modelTextures->get_name($modelName, $modelTexturesId);
if (isset($modelTexturesName)) $json['textures'] = is_array($modelTexturesName) ? $modelTexturesName : array($modelTexturesName);
}
}
foreach ($json['textures'] as $k => $texture)
$json['textures'][$k] = '../model/' . $modelName . '/' . $texture;
$json['model'] = '../model/'.$modelName.'/'.$json['model'];
if (isset($json['pose'])) $json['pose'] = '../model/'.$modelName.'/'.$json['pose'];
if (isset($json['physics'])) $json['physics'] = '../model/'.$modelName.'/'.$json['physics'];
if (isset($json['motions']))
foreach ($json['motions'] as $k => $v) foreach($v as $k2 => $v2) foreach ($v2 as $k3 => $motion)
if ($k3 == 'file') $json['motions'][$k][$k2][$k3] = '../model/' . $modelName . '/' . $motion;
if (isset($json['expressions']))
foreach ($json['expressions'] as $k => $v) foreach($v as $k2 => $expression)
if ($k2 == 'file') $json['expressions'][$k][$k2] = '../model/' . $modelName . '/' . $expression;
header("Content-type: application/json");
echo $jsonCompatible->json_encode($json);
demo
附文
套CDN可能会导致刷新后无法记录,原因是没有请求,具体原因不晓得,可能是CDN进行缓存了,CND刷新后一会刷新后正常记录。
评论区