Laravel队列相关问题记录
经常遇到队列相关的问题,仅此自己记录一下
使用supervisor重启horizon之后代码未生效?
- 官方推荐部署不重启supervisor
部署使用以下命令将优雅退出,之前会出现僵尸进程,目前不清楚是否还有这个问题 php artisan horizon:terminate
- 必须停止supervisor,然后kill残留进程。然后再启动
# 停止所有服务
supervisorctl stop all
# kill进程
ps -ef | grep supervisor
kill -9 进程id
如果进程过多:
ps -ef |grep horizon:work |awk '{print $2}'|xargs kill -9
# 重新启动
supervisord -c /etc/supervisord.conf
supervisorctl reload
- 最近研究一种发送信号的方式,但不确定是否能避免问题
平滑重启
supervisorctl signal hup xxx
需要注意的一个配置 retry_after
在 config/queue.php 下有个配置redis => [ retry_after => 90]
这个配置什么意思呢? 假如你有一个队列任务耗时4-10秒,而retry_after配置为5,那么本次任务在5秒内没执行完,本次任务就会终止,重新推入队列重试。再次执行时如果5秒内执行完了。那么任务才会成功。所以这个配置需要注意: retry_after的配置时间一定要大于任务的执行时间
同一个服务器运行了多个项目需要配置 prefix
在文件config/horizon/prefix,也就是 .env 文件的 HORIZON_PREFIX
不同项目一定要配置不同的prefix,否则队列任务会混淆到一起
多谢群里老哥解答,我也只是照搬记录。
本作品采用《CC 协议》,转载必须注明作者和本文链接
laravel
停止所有得任务很恐怖呀
可以尝试用 systemctl 管理
我也是你这么处理的,但不是每次都这样,比如说你设置了5个redis,1个mysql队列,
正常来说你会看到6条有关队列信息,
supervisor这个工具有的时候报错重启的时候会没有杀死以前的,这样你执行以上命令就会查到12条队列,
这样你重启的时候只会重启其中的6条,然而代码跑进来,会优先进入以前没有重启成功的队列,
我觉得你每次先看一下当前进程数,
然后
stop all
在查看进程数,在start all
,这样起码会保持队列运行中的代码完整执行。能力有限,为什么会重复生产队列进程我也没搞清楚。
可以单独平滑重启某个任务的啊
systemd天下第一
不是直接 php artisan queue:restart 平滑重启嘛
我单独用的supervisord 重启没生效 我直接重启服务器才生效的