You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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每分钟检查进程是否存活,挂了就重启:

  1. 在项目根目录创建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
    
  2. 给脚本加执行权限:
    chmod +x /home/{projectname}/queue-monitor.sh
    
  3. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 17:16:00