如何使用Laravel框架中的队列功能实现异步任务处理?

2026-05-07 04:031阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计863个文字,预计阅读时间需要4分钟。

如何使用Laravel框架中的队列功能实现异步任务处理?

Laravel 的队列服务通过两个进程控制,一个是生产者,一个是消费者。生产者负责发送任务,消费者负责处理任务。这两个进程使用了 Redis 进行任务管理,涉及三个队列:

生产者负责向 redis 推送任务,如果是即时任务,默认就会向 queue:default 推送;如果是延时任务,就会向 queue:default:delayed 推送。

消费者轮询两个队列,不断的从队列中取出任务,先把任务放入 queue:default:reserved 中,再执行相关任务。如果任务执行成功,就会删除 queue:default:reserved 中的任务,否则会被重新放入 queue:default:delayed 队列中。

laravel 队列服务的总体流程

任务分发流程:


任务处理器运作:


创建任务

queue 设置

'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'retry_after' => 90, ],

在config/queue.php中进行配置
一般来说,默认的 redis 配置如上,connection 是 database 中 redis 的连接名称;queue 是 redis 中的队列名称,值得注意的是,如果使用的是 redis 集群的话,这个需要使用 key hash tag,也就是 {default};当任务运行超过 retry_after 这个时间后,该任务会被重新放入队列当中。

任务类的创建

任务类的结构很简单,一般来说只会包含一个让队列用来调用此任务的 handle 方法。

如果想要使得任务被推送到队列中,而不是同步执行,那么需要实现 IlluminateContractsQueueShouldQueue 接口。

如果想要让任务推送到特定的连接中,例如 redis 或者 sqs,那么需要设置 conneciton 变量。

如果想要让任务推送到特定的队列中去,可以设置 queue 变量。

如果想要让任务延迟推送,那么需要设置 delay 变量。

如果想要设置任务至多重试的次数,可以使用 tries 变量;

如果想要设置任务可以运行的最大秒数,那么可以使用 timeout 参数。

如果想要手动访问队列,可以使用 trait : IlluminateQueueInteractsWithQueue。

任务的分发
分发服务
写好任务类后,就能通过 dispatch 辅助函数来分发它了。唯一需要传递给 dispatch 的参数是这个任务类的实例:

class PodcastController extends Controller { public function store(Request $request) { // 创建播客... ProcessPodcast::dispatch($podcast); } }

如果想延迟执行一个队列中的任务,可以用任务实例的 delay 方法。

ProcessPodcast::dispatch($podcast) ->delay(Carbon::now()->addMinutes(10));

通过推送任务到不同的队列,可以给队列任务分类,甚至可以控制给不同的队列分配多少任务。要指定队列的话,就调用任务实例的 onQueue 方法:

ProcessPodcast::dispatch($podcast)->onQueue('processing');

如果使用了多个队列连接,可以将任务推到指定连接。要指定连接的话,可以在分发任务的时候使用 onConnection 方法:

ProcessPodcast::dispatch($podcast)->onConnection('redis ');

本文共计863个文字,预计阅读时间需要4分钟。

如何使用Laravel框架中的队列功能实现异步任务处理?

Laravel 的队列服务通过两个进程控制,一个是生产者,一个是消费者。生产者负责发送任务,消费者负责处理任务。这两个进程使用了 Redis 进行任务管理,涉及三个队列:

生产者负责向 redis 推送任务,如果是即时任务,默认就会向 queue:default 推送;如果是延时任务,就会向 queue:default:delayed 推送。

消费者轮询两个队列,不断的从队列中取出任务,先把任务放入 queue:default:reserved 中,再执行相关任务。如果任务执行成功,就会删除 queue:default:reserved 中的任务,否则会被重新放入 queue:default:delayed 队列中。

laravel 队列服务的总体流程

任务分发流程:


任务处理器运作:


创建任务

queue 设置

'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'retry_after' => 90, ],

在config/queue.php中进行配置
一般来说,默认的 redis 配置如上,connection 是 database 中 redis 的连接名称;queue 是 redis 中的队列名称,值得注意的是,如果使用的是 redis 集群的话,这个需要使用 key hash tag,也就是 {default};当任务运行超过 retry_after 这个时间后,该任务会被重新放入队列当中。

任务类的创建

任务类的结构很简单,一般来说只会包含一个让队列用来调用此任务的 handle 方法。

如果想要使得任务被推送到队列中,而不是同步执行,那么需要实现 IlluminateContractsQueueShouldQueue 接口。

如果想要让任务推送到特定的连接中,例如 redis 或者 sqs,那么需要设置 conneciton 变量。

如果想要让任务推送到特定的队列中去,可以设置 queue 变量。

如果想要让任务延迟推送,那么需要设置 delay 变量。

如果想要设置任务至多重试的次数,可以使用 tries 变量;

如果想要设置任务可以运行的最大秒数,那么可以使用 timeout 参数。

如果想要手动访问队列,可以使用 trait : IlluminateQueueInteractsWithQueue。

任务的分发
分发服务
写好任务类后,就能通过 dispatch 辅助函数来分发它了。唯一需要传递给 dispatch 的参数是这个任务类的实例:

class PodcastController extends Controller { public function store(Request $request) { // 创建播客... ProcessPodcast::dispatch($podcast); } }

如果想延迟执行一个队列中的任务,可以用任务实例的 delay 方法。

ProcessPodcast::dispatch($podcast) ->delay(Carbon::now()->addMinutes(10));

通过推送任务到不同的队列,可以给队列任务分类,甚至可以控制给不同的队列分配多少任务。要指定队列的话,就调用任务实例的 onQueue 方法:

ProcessPodcast::dispatch($podcast)->onQueue('processing');

如果使用了多个队列连接,可以将任务推到指定连接。要指定连接的话,可以在分发任务的时候使用 onConnection 方法:

ProcessPodcast::dispatch($podcast)->onConnection('redis ');