Laravel队列任务卡住需排查三环节:一查监听进程是否运行(ps aux|grep queue:work或supervisorctl status);二查队列积压(Redis用llen queues:default,DB查jobs表中reserved_at为NULL);三查失败日志(failed_jobs表或Log::error记录)。

Laravel 队列任务卡住,通常不是“没运行”,而是卡在监听、执行或失败处理环节。排查核心是:确认队列是否在监听、任务是否被消费、失败后有没有落日志。下面分三块说清楚怎么看、怎么查。
一、确认队列监听进程是否正在运行
Laravel 本身不自动启动队列监听器,靠 php artisan queue:work 或 queue:listen 命令手动/守护方式运行。如果任务“一直不执行”,第一反应是检查这个进程还在不在。
- Linux/macOS 下执行
ps aux | grep 'queue:work',看是否有活跃的 worker 进程 - 若用 Supervisor 管理,运行
supervisorctl status查看laravel-worker(或其他你定义的名称)状态是否为 RUNNING - 注意:使用
queue:work --once或未加--daemon时,单次执行完就退出,不能持续处理新任务
二、查看当前队列中的待处理任务
任务可能已推入队列但尚未被消费,尤其用 Redis 或 Database 驱动时,可直接查底层存储。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- Redis 队列:用
redis-cli连上服务,执行llen queues:default(队列名根据配置可能为default、redis或自定义名)看长度 - Database 队列:查
jobs表,筛选reserved_at IS NULL AND attempts 的记录,即待处理任务 - 若用 Horizon,打开
/horizon后台页面,首页就能看到各队列积压数、最近任务、worker 状态
三、定位失败任务与日志位置
失败任务默认进入 failed_jobs 表(需先运行 php artisan queue:failed-table 和迁移),同时日志会写入 Laravel 日志系统。
- 查失败任务:
php artisan queue:failed列出 ID、连接、队列、失败时间等;也可直接查failed_jobs表的exception字段看报错堆栈 - 查日志文件:默认在
storage/logs/laravel-*.log,搜索关键词如"Failed to process job"、"App\Jobs\YourJobName"或异常类名 - 增强可追溯性:在任务的
failed()方法里加日志,例如Log::error('Job failed', ['job' => get_class($this), 'exception' => $exception->getMessage()]);
队列问题多数出在环境配置(如 Redis 连接超时)、任务内部异常未捕获、或 worker 进程意外终止。把监听状态、队列积压、失败记录这三块串起来看,基本能快速锁定卡点。










