queue_connection改用redis或database需确保php扩展、docker网络、配置缓存、数据库表及任务接口均正确:redis需php-redis扩展或predis包,redis_host填服务名而非localhost,改.env后必清config缓存;database需三张队列表并迁移;验证用tinker查config和redis::ping()。

QUEUE_CONNECTION 改成 redis 或 database 就能用异步队列,但 macOS 下常因缓存、扩展缺失或 Docker 网络配置错导致“改了不生效”。
确认 PHP 已装 Redis 扩展(用 redis 驱动时)
macOS 上 Laravel 9 默认不带 phpredis 或 predis,必须手动补上:
- 用 Homebrew + PHP 官方扩展:先
brew install php-redis,再确认php -m | grep redis有输出 - 用 Composer 装
predis/predis(无需 PHP 扩展):composer require predis/predis - 如果用 Docker 运行 Redis,
REDIS_HOST别填localhost—— macOS 上宿主机的localhost指向本机,不是容器;应填redis(Docker Compose 服务名)或实际容器 IP
改完 .env 后必须清配置缓存
Mac 上开发时,Laravel 会缓存 config,.env 改了 QUEUE_CONNECTION=redis 也白搭:
- 运行
php artisan config:clear(开发环境) - 进
php artisan tinker验证:config('queue.default')返回值必须是"redis",不是"sync" - 别混淆旧键名:
QUEUE_DRIVER是 Laravel 5.7 以前的写法,Laravel 9 只认QUEUE_CONNECTION
database 驱动要建表,且不能只跑一次 migrate
选 database 驱动时,Laravel 9 要三张表才能正常工作:
- 先执行
php artisan queue:table(生成jobs表迁移) - 再执行
php artisan queue:failed-table(failed_jobs) - Laravel 9+ 还需
php artisan queue:batches-table(job_batches,用于批量任务) - 最后统一
php artisan migrate;若已上线,别用migrate:fresh,可指定路径单跑:php artisan migrate --path=database/migrations/2026_01_01_000000_create_jobs_table.php
启动 worker 前先验证连接是否通
Mac 下 queue:work 显示 idle 不代表空闲,很可能是 Redis 连不上却静默失败:
- 在
tinker里执行Redis::ping(),返回"PONG"才算通 - Redis 有密码?必须设
REDIS_PASSWORD,且 Laravel 7+ 要求REDIS_URL格式为redis://:password@host:port - 任务类必须
implements ShouldQueue,否则dispatch()只是普通对象调用,不会进队列
tinker 验证,比反复重启 worker 有效得多。











