应直接删除 personal_access_tokens 表中 expires_at 小于当前时间且不为空的记录,因 token 字段为 bcrypt 加密哈希值不可读,仅 expires_at 字段能准确判断是否过期。
直接删 personal_access_tokens 表里过期的记录就行,但别用 phpmyadmin 手动勾选删除——laravel 的 token 字段是加密过的,没法靠肉眼判断是否过期。
为什么不能在 phpMyAdmin 里“看一眼就删”?
Laravel 的 personal_access_tokens 表中,expires_at 字段才是唯一可靠的过期依据;token 是哈希值(bcrypt),不反解、不可读,phpMyAdmin 里显示的只是散列后的字符串,和原始 token 完全无关。
常见错误现象:
- 看到 token 字段很长、像乱码,以为“看起来旧”就删了 → 可能误删有效 token
- 按 created_at 粗略估算过期时间 → Laravel 默认有效期由 expires_at 精确控制,可能被手动设为 null(永不过期)或自定义时长
-
expires_at为NULL:表示永不过期,不应清理 -
expires_at是过去的时间戳:已过期,可安全删除 -
expires_at是未来时间或当前时间之后:仍有效,跳过
在 phpMyAdmin 中安全执行清理的 SQL
打开 phpMyAdmin → 选中你的数据库 → 点击「SQL」标签页 → 粘贴并运行:
DELETE FROM `personal_access_tokens` WHERE `expires_at` < NOW() AND `expires_at` IS NOT NULL;
这条语句只删满足两个条件的行:
- expires_at 小于当前时间(真正过期)
- expires_at 不为空(排除永不过期的 token)
执行前建议先备份或预览:
- 把 DELETE 换成 SELECT * 跑一遍,确认命中哪些记录
- 注意检查表名是否一致(有些项目改过迁移名,比如加了前缀或用了 sanctum_tokens)
更推荐的方式:用 Laravel 命令行自动清理
phpMyAdmin 是临时手段,长期维护建议用 Laravel 自带机制:
Laravel 从 8.x 起内置了 token:prune Artisan 命令,它会读取模型里的 $pruneAfter 配置,自动删过期 token。
- 确保
App\Models\PersonalAccessToken(或你实际使用的 token 模型)里有prunable()方法和$pruneAfter - 运行命令:
php artisan token:prune --before="6 months ago" - 配合 cron 每天跑一次:
0 2 * * * cd /path/to/app && php artisan token:prune --before="6 months ago" >/dev/null
这个方式比 phpMyAdmin 更可靠:它走 Eloquent 生命周期,触发模型事件、兼容软删除逻辑、适配多数据库驱动。
Token 消耗追踪工具。当用户需要监控 API token 使用情况、生成每日/每周消耗报告、分析使用趋势时使用此 Skill。功能包括:自动记录每次对话的 token 消耗、生成数据表格报告、计算使用趋势和预测、支持定时推送日报。
真正容易被忽略的是 expires_at 字段本身是否被正确写入——如果项目早期用的是 Sanctum 2.x 且没升级迁移,这个字段可能是缺失的,删之前先 DESCRIBE personal_access_tokens 确认结构。
立即学习“PHP免费学习笔记(深入)”;


















