laravel队列任务不执行主因是环境配置或守护进程问题:需确认queue_connection正确启用(如database/redis)、worker进程持续运行、supervisor正确接管并监控,且配置无语法错误、日志显示running状态。

检查 QUEUE_CONNECTION 配置是否生效
这是最常被忽略的第一关。`.env` 中写 QUEUE_CONNECTION=database 或 QUEUE_CONNECTION=redis 才有效;写成 QUEUE_CONNECTION=my_app_db(数据库名)会静默降级为 sync 驱动——任务看似 dispatch 成功,实则同步执行,不会进 jobs 表,也不会触发 worker。
验证方法:
- 运行
php artisan tinker,输入config('queue.default'),看返回值是否为你设的 driver 名(如 "database") - 检查
config/queue.php中对应连接(如'database')是否存在且未被注释 - 若用 database 驱动,确认已执行
php artisan queue:table && php artisan queue:failed-table && php artisan migrate
确认 worker 进程是否实际启动并存活
仅运行 php artisan queue:work 是临时命令,关闭终端即终止。生产环境必须用 Supervisor 等进程管理工具长期守护。
手动测试 worker 是否能拉取任务:
- 先停掉所有 worker:
php artisan queue:restart - 再前台运行一次:
php artisan queue:work --verbose --tries=1,观察是否有日志输出、是否处理 jobs 表中的任务 - 若前台能跑通,说明队列逻辑正常,问题出在守护层
Supervisor 配置文件语法与路径校验
Supervisor 对配置格式极其敏感,一个 yes 写成 true 或引号不闭合都会导致加载失败。
验证步骤:
- 运行
sudo supervisord -c /etc/supervisor/supervisord.conf --check,看是否提示 No errors in config file - 检查程序配置文件路径,例如
/etc/supervisor/conf.d/laravel-worker.conf,确保文件存在且权限为 644 - 关键字段必须准确:
command要指向绝对路径的 artisan(如/var/www/myapp/artisan queue:work --sleep=3 --max-jobs=0),directory必须是项目根目录,user要与 Web 服务用户一致(如 www-data)
Supervisor 状态诊断与日志定位
配置无误后,仍不执行?重点查 Supervisor 自身状态和 worker 日志。
操作清单:
- 重载配置:
sudo supervisorctl reread && sudo supervisorctl update - 查看进程状态:
sudo supervisorctl status,确认 laravel-worker 显示 RUNNING,而非 STARTING 或 FATAL - 查看错误日志:
sudo supervisorctl tail -f laravel-worker stderr,常见报错如 Class 'Redis' not found(缺 redis 扩展)、Connection refused(Redis 服务未启或配置错)、Permission denied(storage 目录不可写) - 检查 Laravel 日志:
tail -f storage/logs/laravel.log,搜索 queue 或 job,确认是否有任务分发记录和异常堆栈











