Laravel队列Worker优先级优化:优先指定队列后处理剩余任务
Laravel Worker 队列优先级扩展方案
要实现先处理jobA、jobB队列,当这两个队列为空时自动处理所有剩余队列的需求,推荐以下两种最优方案:
方案一:自定义Artisan命令(推荐)
创建自定义命令,动态获取系统中所有队列名称,拼接成jobA,jobB,其他队列的格式后,调用原生队列Worker命令,无需修改框架核心逻辑。
步骤:
- 生成自定义命令:
php artisan make:command QueueWorkPrioritized
- 修改生成的
app/Console/Commands/QueueWorkPrioritized.php代码:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Illuminate\Support\Facades\DB; class QueueWorkPrioritized extends Command { protected $signature = 'queue:work-prioritized {--connection=redis} {--timeout=60} {--sleep=3} {--tries=3}'; protected $description = 'Process high priority queues first, then all others'; public function handle() { // 定义高优先级队列 $highPriorityQueues = ['jobA', 'jobB']; // 从jobs表获取所有已存在的队列(去重) $allQueues = DB::table('jobs')->distinct()->pluck('queue')->toArray(); // 合并队列:高优先级在前,其余队列去重后追加 $processedQueues = array_merge($highPriorityQueues, array_diff($allQueues, $highPriorityQueues)); $processedQueues = array_unique($processedQueues); // 拼接为逗号分隔的队列字符串 $queueString = implode(',', $processedQueues); // 调用原生work命令并传递参数 $this->call('queue:work', [ '--queue' => $queueString, '--connection' => $this->option('connection'), '--timeout' => $this->option('timeout'), '--sleep' => $this->option('sleep'), '--tries' => $this->option('tries'), ]); } }
- 运行自定义命令:
php artisan queue:work-prioritized
方案二:Shell脚本动态拼接队列(适合无PHP开发场景)
如果不想编写PHP命令,可通过Shell脚本实现动态队列拼接:
#!/bin/bash # 定义高优先级队列 HIGH_PRIORITY="jobA,jobB" # 从MySQL数据库获取所有队列(需替换为你的数据库连接信息) ALL_QUEUES=$(mysql -u your_db_user -p'your_db_pwd' -D your_db_name -se "SELECT DISTINCT queue FROM jobs;") # 过滤掉高优先级队列并转为逗号分隔格式 OTHER_QUEUES=$(echo "$ALL_QUEUES" | grep -v -E "^(jobA|jobB)$" | tr '\n' ',' | sed 's/,$//') # 拼接最终队列字符串 FINAL_QUEUES="$HIGH_PRIORITY" if [ -n "$OTHER_QUEUES" ]; then FINAL_QUEUES="$FINAL_QUEUES,$OTHER_QUEUES" fi # 启动Worker php artisan queue:work --queue="$FINAL_QUEUES"
注意:若使用Redis队列驱动,需将队列查询逻辑改为Redis命令(如KEYS queues:*)后提取队列名称。
补充说明
两种方案均遵循Laravel原生队列优先级规则:Worker会优先耗尽jobA队列任务,再处理jobB,最后按顺序处理其余队列,确保Worker资源不闲置。
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

