队列
简介
在构建 Web 应用程序时,你可能需要执行一些任务,例如解析和存储上传的 CSV 文件,这些任务在典型的 Web 请求期间需要很长时间才能执行。 值得庆幸的是,Laravel 允许你轻松创建可以在后台处理的队列任务。 通过将时间密集型任务移至队列,你的应用程序可以以极快的速度响应 Web 请求,并为你的客户提供更好的用户体验。
Laravel 队列为各种不同的队列驱动提供统 一的队列 API,例如 Amazon SQS,Redis,甚至关系数据库。
Laravel 队列的配置选项存储在 config/queue.php
文件中。 在这个文件中,你可以找到框架中包含的每个队列驱动的连接配置,包括数据库, Amazon SQS, Redis, 和 Beanstalkd 驱动,以及一个会立即执行作业的同步驱动(用于本地开发)。还包括一个用于丢弃排队任务的 null
队列驱动。
Laravel 提供了 Horizon ,适用于 Redis 驱动队列。 Horizon 是一个拥有漂亮仪表盘的配置系统。如需了解更多信息请查看完整的 Horizon 文档。
连接 Vs. 驱动
在开始使用 Laravel 队列之前,理解「连接」和「队列」之间的区别非常重要。 在 config/queue.php
配置文件中,有一个 connections
连接选项。 此选项定义连接某个驱动(如 Amazon SQS、Beanstalk 或 Redis)。然而,任何给定的队列连接都可能有多个「队列」,这些「队列」可能被认为是不同的堆栈或成堆的排队任务。
请注意, queue
配置文件中的每个连接配置示例都包含一个 queue
属性。
这是将任务发送到给定连接时将被分配到的默认队列。换句话说,如果你没有显式地定义任务应该被发送到哪个队列,那么该任务将被放置在连接配置的 queue
属性中定义的队列上:
use App\Jobs\ProcessPodcast;
// 这个任务将被推送到默认队列...
ProcessPodcast::dispatch();
// 这个任务将被推送到「emails」队列...
ProcessPodcast::dispatch()->onQueue('emails');
有些应用程序可能不需要将任务推到多个队列中,而是倾向于使用一个简单的队列。然而,如果希望对任务的处理方式进行优先级排序或分段时,将任务推送到多个队列就显得特别有用,因为 Laravel 队列工作程序允许你指定哪些队列应该按优先级处理。例如,如果你将任务推送到一个 high
队列,你可能会运行一个赋予它们更高处理优先级的 worker:
php artisan queue:work --queue=high,default