Laravel Horizon部分任务始终显示暂停状态,如何避免该问题?
我来帮你搞定Laravel Horizon里任务一直显示"paused"的问题,这类情况我碰到过不少,大多和进程状态、配置或者依赖服务有关,下面是几个靠谱的排查方向:
首先别光看控制面板显示,先查底层进程状态。在服务器上跑命令:
ps aux | grep horizon
如果看不到Horizon的主进程,那肯定是进程挂了,先重启:
php artisan horizon:terminate php artisan horizon
要是你用supervisor、systemd这类工具管理Horizon,得检查服务状态,比如supervisor可以跑:
supervisorctl status
要是服务异常,直接重启对应的配置就行。
有时候可能不小心在Horizon面板里点了暂停按钮,先去面板里找对应队列,看看有没有"Resume"按钮,有的话点一下恢复。
另外,去config/horizon.php里检查环境配置,有没有给对应环境的supervisor设置了paused => true:
'environments' => [ 'production' => [ 'supervisor-1' => [ 'maxProcesses' => 10, 'paused' => false, // 这里一定要设为false ], ], ],
改完配置记得重启Horizon生效。
如果worker进程因为达到运行时间或处理任务数上限频繁退出,可能会让你误以为队列暂停了。去config/horizon.php的supervisor配置里看看:
'supervisor-1' => [ // ...其他配置 'maxTime' => 0, // 0表示不限制进程运行时长,别设太小 'maxJobs' => 0, // 0表示不限制进程处理任务数 'timeout' => 60, // 任务超时时间,太长可能导致进程挂住 ],
如果maxTime或maxJobs数值太小,调大或者设为0试试,然后重启Horizon。
Horizon完全依赖Redis管理队列和进程状态,Redis出问题的话,Horizon就会乱套。先测试连接:
php artisan redis:cli
进去后输入PING,看是否返回PONG。或者用Laravel的tinker测试:
php artisan tinker
然后执行:
Redis::ping();
如果Redis连接失败,检查Redis服务是否启动、配置文件里的Redis参数(主机、端口、密码)是否正确,修复后重启Horizon。
有时候Horizon的状态缓存会出问题,导致显示异常。跑命令清理:
php artisan horizon:clear
顺便也清理下Laravel的配置和缓存:
php artisan config:clear php artisan cache:clear
然后重启Horizon,看看状态是否恢复正常。
版本不兼容也会导致各种奇怪问题,比如Laravel 10需要Horizon 5.x,Laravel 9对应Horizon 4.x。去composer.json里核对版本,要是不匹配,更新到兼容版本:
composer require laravel/horizon:^x.x
替换x.x为对应兼容的版本号,更新后发布配置并重启Horizon。
一般按这个顺序排查,基本能解决任务一直显示paused的问题。
内容的提问来源于stack exchange,提问作者Jeryfer

