译文 GitHub https://github.com/yuansir/diving-laravel-zh
原文链接https://divinglaravel.com/queue-system/before-the-dive
Laravel 接收请求,做一些工作,然后向用户返回响应,这是处理请求的 Web 服务器的正常同步工作流程,但有时您需要在后台执行不中断或减慢的一些流程,例如在订单之后向用户发送发票电子邮件,你不想让用户等待邮件服务器接收请求,构建电子邮件消息,然后分派给用户,你只要向屏幕发送“谢谢!”给用户,电子邮件在后台准备和发送,他继续做他自己的事。
Laravel 配有内置的队列系统,可帮助您在后台运行任务,并通过简单的 API 来配置系统在不同情况下起作用。
您可以在 config/queue.php
中管理队列配置,默认情况下它有使用不同队列驱动的几个连接,您可以看到项目中可以有多个队列连接,也可以使用多个队列驱动程序。
我们将研究不同的配置,但请先看看 API:
Queue::push(new SendInvoice($order));
return redirect('thank-you');
队列Queue
facade 是 queue
容器别名,如果我们看看Queue\QueueServiceProvider
,我们可以看到这个别名是如何注册的:
protected function registerManager()
{
$this->app->singleton('queue', function ($app) {
return tap(new QueueManager($app), function ($manager) {
$this->registerConnectors($manager);
});
});
}
所以 Queue
facade 代理到在容器中注册为 Queue\QueueManager
类的单例,我们还将连接器注册到 Laravel 所支持使用的registerConnectors()
的不同队列驱动程序中:
public function registerConnectors($manager)
{
foreach (['Null', 'Sync', 'Database', 'Redis', 'Beanstalkd', 'Sqs'] as $connector) {
$this->{"register{$connector}Connector"}($manager);
}
}
该方法只需调用注册 register{DriverName}Connector
方法,例如注册一个 Redis 连接器:
protected function registerRedisConnector($manager)
{
$manager->addConnector('redis', function () {
return new RedisConnector($this->app['redis']);
});
}
addConnector()
方法将值存储到 QueueManager::$connectors
类属性。 连接器只是一个类,它包含一个 connect()
方法,它根据需要创建所需驱动的一个实例,方法看起来像在Queue\Connectors\RedisConnector
里面:
public function connect(array $config)
{
return new RedisQueue(
$this->redis, $config['queue'],
Arr::get($config, 'connection', $this->connection),
Arr::get($config, 'retry_after', 60)
);
}
所以现在 QueueManager 被注册到容器中,它知道如何连接到不同的内置队列驱动,如果我们看下这个类,我们将在最后找到一个__call()
魔术方法:
public function __call($method, $parameters)
{
return $this->connection()->$method(...$parameters);
}
对 QueueManager
类中不存在的方法的所有调用将被发送到加载的驱动中,例如当我们调用 Queue::push()
方法时,所发生的是 manager 选择了连接到它的所需队列驱动 ,并在该驱动上调用 push
方法。
让我们看下 connection()
方法
public function connection($name = null)
{
$name = $name ?: $this->getDefaultDriver();
if (! isset($this->connections[$name])) {
$this->connections[$name] = $this->resolve($name);
$this->connections[$name]->setContainer($this->app);
}
return $this->connections[$name];
}
当没有指定连接名称时,Laravel 将根据配置文件使用默认队列连接, getDefaultDriver()
返回config/queue.php['default']
的值:
public function getDefaultDriver()
{
return $this->app['config']['queue.default'];
}
一旦定义了驱动名称,管理器将检查该驱动是否已被加载,只有当它不是开始连接到该驱动程序并使用 resolve()
方法加载它时:
protected function resolve($name)
{
$config = $this->getConfig($name);
return $this->getConnector($config['driver'])
->connect($config)
->setConnectionName($name);
}
首先从 config/queue.php
文件加载所选连接的配置,然后将连接器定位到所选驱动,调用 connect()
方法,最后设置连接名称以供进一步使用。
是的,当您执行 Queue::push()
时,您正在使用的队列驱动中调用 push
方法,每个驱动以其自己的方式处理不同的操作,但 Laravel 为您提供了一个统一的接口,您可以使用它告诉队列管理器你使用了什么驱动程序。
简单来说,您可以使用自定义驱动的名称调用 Queue::addConnector()
,以及一个解释如何获取与该驱动程序的连接的闭包,还要确保您的连接器实现 Queue\Connectors\ConnectorInterface
接口。
注册连接器后,您可以使用任何使用此驱动的连接:
Queue::connection('my-connection')->push(...);
继续“准备队列作业”
转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记
如果觉得本篇文章对您十分有益,何不 打赏一下
本文链接地址: 剖析 Laravel 队列系统之初探
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可
Original url: Access
Created at: 2018-12-19 13:53:31
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论