如何在Laravel 5.8(Redis驱动)中通过Job ID删除长运行任务
解决方案
本方案适用于Laravel 5.8、PHP 7.3、Redis驱动的队列场景,可按以下操作根据Job ID删除指定队列任务:
场景1:删除未到执行时间的延迟任务/待执行任务
Laravel 5.8的Redis队列中,延迟任务存储在有序集合queues:{你的队列名}:delayed中,已到执行时间未消费的待执行任务存储在列表queues:{你的队列名}中,可通过以下两种方式删除:
方式1:通过Laravel代码删除
use Illuminate\Support\Facades\Redis; // 替换为实际队列名,默认队列名为default $queueName = 'default'; // 替换为要删除的目标Job ID $targetJobId = 'xxx'; $redis = Redis::connection(); // 删除延迟队列中的目标任务 $delayedKey = 'queues:' . $queueName . ':delayed'; $delayedJobs = $redis->zrange($delayedKey, 0, -1); foreach ($delayedJobs as $jobPayload) { $payload = json_decode($jobPayload, true); if (isset($payload['id']) && $payload['id'] == $targetJobId) { $redis->zrem($delayedKey, $jobPayload); echo "延迟队列任务删除成功"; break; } } // 删除待执行队列中的目标任务(如果需要) $waitingKey = 'queues:' . $queueName; $waitingJobs = $redis->lrange($waitingKey, 0, -1); foreach ($waitingJobs as $jobPayload) { $payload = json_decode($jobPayload, true); if (isset($payload['id']) && $payload['id'] == $targetJobId) { $redis->lrem($waitingKey, 0, $jobPayload); echo "待执行队列任务删除成功"; break; } }
方式2:通过Redis命令行直接删除
# 1. 查找延迟队列中匹配Job ID的任务,替换队列名、目标Job ID redis-cli ZSCAN queues:default:delayed 0 MATCH "*\"id\":\"你的目标Job ID\"*" # 2. 拿到返回的完整任务payload后,执行删除,替换payload内容 redis-cli ZREM queues:default:delayed "返回的完整任务payload字符串" # 待执行队列查找命令 redis-cli LRANGE queues:default 0 -1 | grep "你的目标Job ID"
场景2:删除正在运行中的任务
如果任务已经被队列worker进程取出执行,Redis中已无对应记录,需直接终止执行任务的PHP进程:
- 第一步:查找运行队列任务的进程
ps aux | grep "queue:work"
- 第二步:确认进程ID对应你要删除的任务后,终止进程
kill -9 目标进程ID
注意:终止进程前请核对进程对应的任务内容,避免误杀其他正常运行的队列任务
注意事项
- 操作前建议先备份Redis对应队列的key数据,避免误删其他任务
- 如果你的Laravel配置了Redis前缀,需要在所有队列key前加上
config('database.redis.options.prefix')对应的前缀值
内容的提问来源于stack exchange,提问作者Maries
相关产品推荐
相关产品推荐

