如何让Laravel的queue:work在Windows任务计划程序中持续运行(队列为空时不停止)
解决Windows下Laravel Queue Worker空队列时停止运行的问题
针对你的场景,要让php artisan queue:work持续运行不退出,可以从调整Worker命令参数和优化Windows任务计划配置两方面入手,以下是具体方案:
一、修正Laravel Queue Worker命令
你之前使用的--daemon参数在Laravel 5.7+版本已被废弃(默认queue:work就是守护模式),且未指定空队列时的休眠策略,导致Worker处理完任务后直接退出。请改用以下命令:
php artisan queue:work database --sleep=3 --tries=3 --timeout=60
参数说明:
database:指定使用你的默认数据库队列驱动(可根据实际调整)--sleep=3:队列为空时,Worker休眠3秒后再次检查队列,避免直接退出--tries=3:每个任务最多尝试3次(失败后进入失败队列)--timeout=60:单个任务的最长执行时间(防止任务卡死)
二、优化Windows任务计划配置
确保任务计划能在Worker意外退出时自动重启,同时保证启动参数正确:
创建/编辑任务
- 程序或脚本:填写PHP的完整路径(例如
C:\PHP7.2\php.exe) - 添加参数:填写
artisan queue:work database --sleep=3 --tries=3 --timeout=60 - 起始于:填写你的Laravel项目根目录(例如
C:\Projects\YourLaravelApp)
- 程序或脚本:填写PHP的完整路径(例如
调整任务设置
- 切换到「设置」标签页:
- 勾选「如果任务失败,每隔5分钟重试,最多重试3次」(可根据需求调整间隔和次数)
- 勾选「如果任务已经在运行,不要启动新实例」
- 勾选「允许任务按需运行」
- 确保「如果任务运行时间超过X小时,停止任务」的选项不勾选(或设置足够长的时间)
- 切换到「设置」标签页:
触发器配置
- 保持「开机启动」的触发器,同时可添加「登录时」的触发器(确保用户登录后也能启动)
- 触发器的「重复任务间隔」无需设置(Worker本身会持续运行),只需设置任务启动一次即可
三、备选方案:用批处理脚本循环重启Worker
如果上述配置仍有问题,可以写一个批处理脚本强制循环启动Worker:
创建queue-worker.bat文件,内容如下:
@echo off title Laravel Queue Worker :loop cd /d "C:\Projects\YourLaravelApp" php artisan queue:work database --sleep=3 --tries=3 --timeout=60 echo Worker exited, restarting in 5 seconds... timeout /t 5 /nobreak > nul goto loop
然后在Windows任务计划中设置启动这个批处理脚本,这样即使Worker意外退出,脚本会自动重启它。
注意事项
- 确保任务计划的运行用户拥有Laravel项目目录和PHP.exe的读写/执行权限,建议用管理员权限运行任务
- 定期查看Laravel的
storage/logs/laravel.log,排查Worker是否有异常退出的错误信息 - 若使用Laravel Horizon(适合Laravel 5.8+),可以更方便地管理队列Worker,但需要Redis支持
内容的提问来源于stack exchange,提问作者Stevani Putri
相关产品推荐
相关产品推荐

