<p>Horizon 日志表为 horizon_jobs、horizon_failed_jobs 和 horizon_monitored_tags,位于数据库中;实时监控数据存于 Redis 的 horizon:* 键中。</p>
Horizon 日志表名和数据位置在哪
horizon 的运行日志(如任务失败记录、监控指标、最近的 job 列表)默认不存进 jobs 表,而是写入 redis —— 但它的「历史记录」(比如 failed_jobs 页面看到的失败任务快照、recent 标签页的任务列表)实际依赖数据库里的 horizon_jobs、horizon_failed_jobs 和 horizon_monitored_tags 这几张表。laravel 10+ 默认启用这些表;老版本或手动禁用过 use_database 配置的则可能压根没建。
先确认表是否存在:php artisan migrate:status | grep horizon
或者直接查库:SHOW TABLES LIKE 'horizon%';
- 如果没表,说明 Horizon 没启用数据库持久化,清空 Redis 就够了(见下一条)
- 如果有表,但
horizon_jobs为空,而 Web UI 还显示旧数据 → 很可能是 Redis 缓存未刷新,不是数据库问题 - 表存在且有大量数据,才需要走 SQL 清空路径
清空数据库表:truncate 还是 delete
用 TRUNCATE TABLE,别用 DELETE FROM。前者重置自增 ID、更快、不走事务日志;后者在大表上慢,还可能被锁住。Horizon 不依赖主键连续性,TRUNCATE 安全。
执行顺序很重要:必须按依赖关系来,否则外键报错:
TRUNCATE TABLE horizon_monitored_tags;TRUNCATE TABLE horizon_failed_jobs;TRUNCATE TABLE horizon_jobs;
注意:某些 MySQL 配置(如 FOREIGN_KEY_CHECKS=ON)会阻止 TRUNCATE。临时关掉:SET FOREIGN_KEY_CHECKS = 0; → 执行上面三条 → SET FOREIGN_KEY_CHECKS = 1;
Redis 中的实时监控状态怎么重置
Horizon Web UI 的「当前队列长度」「处理中任务数」「每秒吞吐量」等,全部来自 Redis 的哈希和有序集合,比如:horizon:supervisors、horizon:metrics、horizon:queues。这些不会因清空数据库而消失,必须手动清理。
最稳妥的方式是只删 Horizon 相关 key,避免误伤其他业务缓存:
- 用
redis-cli --scan --pattern 'horizon:*' | xargs redis-cli del(推荐) - 或进
redis-cli后执行:KEYS horizon:*看一眼,再DEL具体 key
⚠️ 别用 FLUSHDB 或 FLUSHALL:会把 session、cache、queue 等全干掉,线上慎用。
重启 Horizon 进程后为什么还是旧数据
常见于 supervisor 配置没 reload,或 Horizon 进程没真正退出。仅执行 php artisan horizon:terminate 不够,它只是发信号,进程可能卡住。
- 先查进程:
ps aux | grep horizon - 杀干净:
pkill -f "artisan horizon"(确保无残留) - 再启动:
php artisan horizon或让 supervisor 自动拉起
另外,浏览器端有前端缓存:Horizon 的 JS 会本地存 last_seen_job_id 等状态,硬刷(Ctrl+F5)或清 localStorage 更可靠。打开 DevTools → Application → Local Storage → 找 horizon. 开头的键,删掉。
真正麻烦的是 metrics 数据(如每分钟任务数曲线),它写进 Redis 的 horizon:metrics 哈希后,还会被 Horizon 的定时任务聚合到 horizon:metrics:hourly 等 key。这些 key 名带时间戳,删完立刻重建,所以「刚清完又出来」是正常现象——它反映的是最近一小时的真实流量,不是历史残留。

















