队列
简介
在构建 Web 应用程序时,你可能需要执行一些任务(例如解析和存储上传的 CSV 文件),但这些任务在典型的 Web 请求中花费的时间太长。幸运的是,Laravel 允许你轻松地创建可在后台排队处理的任务作业。通过将耗时的任务移到队列中,你的应用程序可以以超快的速度响应 Web 请求,并为客户提供更好的用户体验。
Laravel 队列提供了可以跨各种不同队列后台的统一 API,例如 Amazon SQS, Redis 甚至关系数据库。
队列配置文件存储在 config/queue.php
中。 在这个文件中,你可以找到框架中包含的每个队列驱动程序的连接配 置,其中包括数据库,Amazon SQS, Redis, 和 Beanstalkd 驱动,一个同步驱动程序(供本地使用)。还包括一个用于丢弃排队任务的 null
队列驱动。
技巧:现在,Laravel 为你的 Redis 队列提供了 Horizon,一个漂亮的仪表盘和配置系统。查看完整的 Horizon documentation 了解更多信息。
连接 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