如何在cPanel中持续运行php artisan queue:work?解决队列堆积问题
解决Laravel队列满员问题:让
php artisan queue:work持续运行 你的核心问题是每分钟用Cron启动queue:work的方式不对——queue:work本身是常驻进程,重复启动会导致大量进程堆积,不仅没法高效处理队列,还会消耗服务器资源,最终导致队列满员。下面给你几种在cPanel环境下的可行方案:
方案1:用cPanel进程管理器(推荐)
大部分现代cPanel面板都自带进程管理工具(通常叫「Process Manager」或「Processes」),这是让队列进程常驻最稳定的方式:
- 登录cPanel,找到「Process Manager」入口
- 点击「Add Process」,在命令框里填入完整的执行命令,比如:
(注:/usr/local/bin/php /home/{projectname}/laravel/artisan queue:work --timeout=60 --tries=3 --sleep=3/usr/local/bin/php是你的PHP可执行文件绝对路径,不确定的话可以在cPanel终端里跑which php获取;后面的参数是优化进程稳定性的可选配置) - 设置「Restart Policy」为「Automatically restart if the process stops」
- 保存并启动进程,之后这个队列 worker 会一直运行,挂了会自动重启
方案2:用Cron+Shell脚本监控进程
如果你的cPanel没有进程管理器,可以写个简单的监控脚本,让Cron每分钟检查进程是否存活,挂了就重启:
- 在项目根目录创建
queue-monitor.sh脚本,内容如下:#!/bin/bash # 定义进程标识和完整命令 PROCESS_MARKER="php artisan queue:work" FULL_COMMAND="/usr/local/bin/php /home/{projectname}/laravel/artisan queue:work --timeout=60 --tries=3 --sleep=3" # 检查进程是否存在 if ! pgrep -f "$PROCESS_MARKER" > /dev/null; then # 后台启动进程,输出日志到空设备(也可以指定日志文件) nohup $FULL_COMMAND > /dev/null 2>&1 & fi - 给脚本加执行权限:
chmod +x /home/{projectname}/queue-monitor.sh - 在cPanel的Cron任务里添加一条每分钟执行的任务:
* * * * * /home/{projectname}/queue-monitor.sh
关键注意事项
- 绝对不要直接用Cron每分钟跑
php artisan queue:work,这会不断创建新进程,最终把服务器资源耗光 - 定期清理失败队列:可以用
php artisan queue:flush清除所有失败任务,或者在config/queue.php里配置失败任务的过期时间 - 如果队列任务量大,可以考虑多开几个worker进程(但要根据服务器CPU/内存配置来,比如开2-3个,不要贪多),或者给任务设置优先级(比如
queue:work --queue=high,default)
内容的提问来源于stack exchange,提问作者aref razavi
相关产品推荐
相关产品推荐

