Docker本地开发环境中Laravel Horizon任务Pending未执行问题
问题:Laravel Horizon队列任务始终处于Pending状态(Docker环境)
本地Docker环境配置Laravel Horizon+Redis队列后,Horizon面板可正常访问,但提交的队列任务一直处于Pending状态无法执行。执行php artisan horizon无效,但php artisan horizon:work能处理所有Pending任务。
相关配置文件
docker-compose.yml
version: '3.1' services: app: build: . container_name: app restart: always tty: true ports: - "80:80" working_dir: /var/www volumes: - ./code:/var/www - data:/var/run/php depends_on: - redis networks: - app-network redis: container_name: redis hostname: redis image: redis:alpine restart: unless-stopped volumes: - data:/.data networks: - app-network queue: container_name: queue hostname: queue image: redis:alpine restart: unless-stopped volumes: - data:/.data networks: - app-network volumes: data: networks: app-network: driver: bridge
.env
APP_NAME="Laravel" APP_ENV=local APP_KEY= APP_DEBUG=true APP_URL=http://localhost LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=mydb DB_USERNAME=root DB_PASSWORD=password BROADCAST_DRIVER=log CACHE_DRIVER=redis FILESYSTEM_DISK=local QUEUE_CONNECTION=redis SESSION_DRIVER=redis SESSION_LIFETIME=120 REDIS_HOST=redis REDIS_PASSWORD=null REDIS_PORT=6379 QUEUE_DRIVER=redis REDIS_QUEUE=queue REDIS_QUEUE_HOST=queue AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false
horizon.php(关键片段)
'defaults' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'auto', 'autoScalingStrategy' => 'time', 'maxProcesses' => 10, 'maxTime' => 0, 'maxJobs' => 0, 'memory' => 128, 'tries' => 1, 'timeout' => 60, 'nice' => 0, ], ], 'environments' => [ 'production' => [ 'supervisor-1' => [ 'maxProcesses' => 10, 'balanceMaxShift' => 1, 'balanceCooldown' => 3, ], ], 'local' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'auto', 'autoScalingStrategy' => 'time', 'maxProcesses' => 10, 'maxTime' => 0, 'maxJobs' => 0, 'memory' => 128, 'tries' => 1, 'timeout' => 60, 'nice' => 0, ], ], ],
修复方案
1. 移除多余的Redis容器
docker-compose.yml中queue服务是冗余的Redis实例,和redis服务冲突,直接删除该服务:
修改后的docker-compose.yml相关部分:
services: app: # ... 原有配置不变 depends_on: - redis networks: - app-network redis: container_name: redis hostname: redis image: redis:alpine restart: unless-stopped volumes: - data:/.data networks: - app-network # 移除queue服务
2. 统一Redis队列配置(修正.env)
.env中存在冲突的Redis队列配置,REDIS_QUEUE_HOST是无效配置,且REDIS_QUEUE=queue和Horizon监听的default队列不匹配,修改如下:
# 删除无效的REDIS_QUEUE_HOST=queue # 将REDIS_QUEUE改为Horizon监听的队列名称 REDIS_QUEUE=default # 保留QUEUE_CONNECTION=redis,删除过时的QUEUE_DRIVER(Laravel 5.7+已废弃)
3. 确保Horizon在App容器内运行
执行php artisan horizon时,必须进入app容器内部执行,而不是宿主机:
# 进入app容器 docker exec -it app bash # 在容器内启动Horizon php artisan horizon
4. 重启相关服务并清除缓存
修改配置后,重启Docker服务并清除Laravel配置缓存:
# 重启Docker容器 docker-compose down && docker-compose up -d # 进入app容器清除缓存 docker exec -it app php artisan config:clear docker exec -it app php artisan cache:clear
5. 验证Horizon进程状态
启动Horizon后,检查容器内的进程是否正常运行:
docker exec -it app ps aux | grep horizon
如果看到Horizon相关进程,说明启动成功,此时提交队列任务应该能被正常处理。
内容的提问来源于stack exchange,提问作者ALTELMA
相关产品推荐
相关产品推荐

