必须在路由匹配前的中间件中获取$request->pathinfo(),此时返回原始路径如/u,尚未被别名替换;需配合预定义的alias_map配置比对键名,并用Cache::inc()原子递增api:alias:$rawPath键。

路由别名本身不产生独立请求记录——Route::alias('u', 'user/info')只是在路由解析早期把 /u 替换成 /user/info,后续所有统计逻辑都落在真实路由地址上。想统计“别名被调用了多少次”,必须在别名替换完成、真实路由确定前捕获原始 URL 路径。
怎么拿到原始请求路径(不是重写后的)
ThinkPHP 的中间件执行时机在路由匹配前,此时 $request->url() 或 $request->pathinfo() 返回的是用户实际访问的路径,比如 /u,还没被 alias 替换。这是唯一能区分别名调用的窗口期。
- 别名注册后,路由系统会在
think\Route内部做一次预处理,但这个过程不可拦截;所以不能在控制器或钩子中查$this->request->action()来反推别名 - 不要用
$request->route()->getRule(),它返回的是匹配后的规则(如user/info),不是原始请求 - 推荐在全局中间件(如
app/middleware/RouteAliasLogger.php)中获取:$rawPath = $request->pathinfo();
如何关联别名和真实路由地址
ThinkPHP 没有公开 API 可以反向查 “/u 对应哪个 alias 目标”,所以得自己维护映射表。最稳妥的方式是复用你在 route.php 里定义的别名数组,把它导出为可被中间件读取的配置。
- 把别名映射提前抽成独立配置文件,例如
config/alias_map.php:
return [
'u' => 'user/info',
'order' => 'order/list',
'setting' => 'system/setting',
];
- 中间件中加载它:
$aliasMap = config('alias_map'); - 检查当前
$rawPath是否在$aliasMap键中:if (isset($aliasMap[$rawPath])) { ... } - 注意:别名不带前导斜杠,
$rawPath默认也不带,直接比对即可
记录别名调用次数(Redis 原子计数)
别名调用频次统计本质还是接口调用量统计,只是 key 的构造维度变了——用原始路径做 key,而不是标准化后的路由地址。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 构造 Redis key:
api:alias:'.$rawPath,例如api:alias:u - 递增操作:
Cache::inc('api:alias:'.$rawPath, 1, 3600),TTL 设为 1 小时,避免 key 泛滥 - 不要用
Cache::set($key, Cache::get($key) + 1),非原子操作,在并发下会丢数 - 如果需要按天聚合,后续用命令行任务扫描
api:alias:*并写入数据库,逻辑和普通接口统计一致
为什么直接查 Cache::get('api:alias:u') 有时返回 null
Cache::inc() 确实会自动初始化 key 为 1,但前提是该 key 当前不存在且没被其他逻辑主动 set(null) 或 set('') 过。常见干扰源:
- 中间件里写了
Cache::set('api:alias:'.$rawPath, null, 3600)用于占位,结果inc把 null 当 0 加,返回 1,但下次再get仍是 null(Redis 中 null 和空字符串不同) - 测试时手动用
redis-cli执行了SET api:alias:u "",导致INCR失败并报错(Redis 返回 (error) ERR value is not an integer or out of range) - 解决办法:统一用
Cache::inc()启动计数,全程不set;查值时用Cache::get('api:alias:u', 0)提供默认值
真正难的不是存数据,而是确保你统计的“别名调用”确实来自用户真实请求,而不是内部跳转、curl 测试或前端误配的链接——这些都会污染原始路径来源,而你没法靠别名本身过滤它们。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










