侧边栏壁纸
博主头像

我依旧在追寻自由的路上

  • 累计撰写 123 篇文章
  • 累计创建 9 个分类
  • 累计创建 32 个标签

目 录CONTENT

文章目录

live2d调用次数统计

柚子
原创 / 2024-12-04 / 0 评论 / 0 点赞 / 29 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响您的利益,请联系 站长 删除。

前言

之前为随机图写了统计功能,闲着没事将live2d_api看了看,为其也添加了调用次数统计功能。

https://github.com/fghrsh/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

https://api.houxiongxiong.icu/

附文

套CDN可能会导致刷新后无法记录,原因是没有请求,具体原因不晓得,可能是CDN进行缓存了,CND刷新后一会刷新后正常记录。

评论区