部署在Ploi.io的Laravel项目Horizon任务一直处于Pending状态
Laravel Horizon任务一直Pending无法执行的排查方案(Ploi.io部署环境)
针对你在Ploi.io部署的Laravel项目中Horizon任务始终处于Pending状态的问题,以下是常规方案之外的进阶排查思路:
1. 核对Redis队列键前缀与连接一致性
- 检查
.env中的REDIS_PREFIX配置,确认Horizon与任务分发使用的Redis键前缀完全一致。比如若.env设置REDIS_PREFIX=laravel_,需确保Horizon监听的队列键是laravel_queue:default,而非其他前缀。 - 登录服务器执行
redis-cli,输入KEYS "*queue*"查看Redis中实际存在的队列键,同时确认任务是否真的被推入目标队列(可通过LRANGE laravel_queue:default 0 -1查看队列内容)。
2. 检查Horizon进程的运行状态与权限
- 执行
ps aux | grep horizon确认Horizon进程是否正常运行,若进程存在但无响应,查看storage/logs/horizon.log中的报错信息(常见问题:Redis连接超时、目录权限不足导致日志无法写入)。 - 验证Horizon进程的运行用户(通常为
www-data或部署用户)是否具备Redis读写权限,以及项目目录的读写权限。
3. 排查任务本身的序列化问题
- 若任务中包含无法序列化的对象(如闭包、未实现
Serializable接口的模型关联),会导致任务卡在Pending状态。可临时简化任务逻辑(比如仅在handle方法中写入日志),测试是否能正常执行,以此排除任务代码的问题。
4. 确认Horizon环境配置加载正确性
- 检查
.env中的APP_ENV是否设置为production,确保Horizon加载的是environments.production下的配置(而非默认的defaults配置)。 - 执行
php artisan horizon:status查看当前Horizon的运行状态,确认监听的队列名称、进程数与horizon.php配置一致。
5. 排查Redis服务器异常
- 执行
redis-cli info memory查看Redis内存使用情况,若used_memory_peak接近maxmemory,Redis会拒绝写入新任务,需调整内存限制或清理过期数据。 - 检查Redis是否存在持久化阻塞(如RDB快照生成、AOF重写),这类操作会暂时阻塞队列读写,导致任务Pending。
6. Ploi平台专属配置检查
- 登录Ploi面板,确认Horizon守护进程的启动命令为
php artisan horizon --env=production,避免因环境参数缺失导致配置加载错误。 - 检查Ploi的环境变量是否覆盖了Laravel的队列配置,确认
QUEUE_CONNECTION设置为redis,而非sync或其他无效连接。
你提供的Horizon配置参考:
'defaults' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default'], 'balance' => 'auto', 'autoScalingStrategy' => 'time', 'maxProcesses' => 1, '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' => [ 'maxProcesses' => 3, ], ], ],
内容的提问来源于stack exchange,提问作者Cosmin
相关产品推荐
相关产品推荐

