原文链接https://divinglaravel.com/queue-system/before-the-diveLaravel收到一个请求,做一些工作,然后返回一个响应给用户,这是处理请求的Web服务器的正常同步工作流程,但有时您需要在幕后做一些工作,这些工作不会中断或减慢此流程,例如在下订单后向用户发送发票电子邮件,您不希望用户等到邮件服务器收到请求,构建电子邮件消息,然后将其发送给用户,而是希望显示“谢谢!”向用户显示屏幕,以便他可以在后台准备和发送电子邮件的同时继续他的生活。Laravel接受一个请求,做一些工作,然后返回一个响应给用户,这是一个处理请求的web服务器正常的同步工作流程,但有时你需要在后台不间断地做一些事情或者一些减慢的进程,例如在下订单后向用户发送发票电子邮件,您不希望用户等待邮件服务器收到请求,构建电子邮件消息,然后将其发送给用户,您只需发送一个“谢谢你!”到屏幕给用户,email邮件在后台准备好发送了,他继续做自己的事情。Laravel附带了一个内置的队列系统,可以帮助您在后台运行任务,并使用非常简单的API配置系统在不同情况下的反应方式。Laravel配备了一个内置的队列系统,可以帮助您在后台运行任务后台,并通过简单的API来配置系统在不同情况下工作。您可以在config/queue.php中管理您的队列配置,默认情况下它有几个使用不同队列驱动程序的连接,正如您所看到的,您可以在您的项目中有多个队列连接并使用多个队列驱动程序。你可以配置Queue配置在/queue.php中管理,默认有多个连接使用不同的队列驱动,你可以看到一个项目中可以有多个队列连接,也可以使用多个队列驱动。我们将研究不同的配置,但首先让我们看一下API:Queue::push(newSendInvoice($order));returnredirect('thank-you');这里的Queuefacade代理队列容器别名,如果我们看一下Queue\QueueServiceProvider我们可以看到这个别名是如何注册的:Queuefacade是队列容器别名,如果我们看查看Queue\QueueServiceProvider,我们可以看到这个别名是如何注册的:function($manager){$this->registerConnectors($manager);});});}所以Queuefacade代理到在容器中注册为单例的Queue\QueueManager类,我们还将连接器注册到不同的Laravel支持使用registerConnectors()的队列驱动程序:因此队列外观代理到在容器中注册为Queue\QueueManager类的单例,我们还使用registerConnectors()将连接器注册到Laravel支持的内容在不同的队列驱动程序中:publicfunctionregisterConnectors($manager){foreach(['Null','Sync','Database','Redis','Beanstalkd','Sqs']as$connector){$this->{"注册{$connector}连接器"}($manager);}}Thismethodsimplycallsregister{DriverName}Connectormethod,exampleitregisteraRedisconnector:Thismethodsimplycallsregister{DriverName}Connectormethod,比如注册一个Redisconnector:protectedfunctionregisterRedisConnector($manager){$manager->addConnector('redis',function(){returnnewRedisConnector($this->app['redis']);});}addConnector()方法将值存储到一个QueueManager::$connectors类属性。连接器只是一个包含connect()方法的类,该方法根据需要创建所需驱动程序的实例,下面是该方法在Queue中的样子The\Connectors\RedisConnector:addConnector()方法将值存储到QueueManager::$连接器类属性连接器只是一个包含connect()方法的类,该方法根据需要创建所需驱动程序的实例,该方法类似于Queue\Connectors\RedisConnector:publicfunctionconnect(array$config){returnnewRedisQueue($this->redis,$config['queue'],Arr::get($config,'connection',$this->connection),Arr::get($config,'retry_after',60));}所以现在QueueManager已注册到容器中,它知道如何连接到不同的内置队列驱动程序,如果我们查看该类,我们会在末尾找到一个__call()魔术方法:容器,它知道如何连接到不同的内置队列驱动程序,如果我们查看类,我们会在末尾找到一个__call()魔术方法:publicfunction__call($method,$parameters){return$this->connection()->$method(...$parameters);}所有对QueueManager类中不存在的方法的调用将被发送到加载的驱动程序,例如当我们调用Queue::push()方法时,发生的事情是那妈nager选择了所需的队列驱动程序,连接到它,并调用了push方法司机。所有对QueueManager类中不存在的方法的调用将被发送到加载的驱动程序,例如当我们调用Queue::push()方法时,发生的事情是管理器选择连接到它的所需队列驱动程序,并且在驱动程序上调用push方法经理如何知道选择哪个司机?经理如何知道选择哪个司机?让我们看一下connection()方法:让我们看一下connection()方法publicfunctionconnection($name=null){$name=$name?:$this->getDefaultDriver();如果(!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']的值:当没有指定连接名时,Laravel会根据配置文件使用默认的队列连接,getDefaultDriver()返回config/queue.php['default']的值:publicfunctiongetDefaultDriver(){return$this->app['config']['queue.default'];}一旦定义了驱动程序名称,管理器将检查之前是否加载了该驱动程序,只有在没有加载的情况下,它才开始连接到该驱动程序并使用resolve()方法:一旦定义了驱动程序名称,管理器将检查驱动程序是否已经加载,只有当它不是第一次连接到驱动程序时才使用resolve()方法加载它:protectedfunctionresolve($name){$config=$this->getConfig($name);return$this->getConnector($config['driver'])->connect($config)->setConnectionName($name);}首先,它从你的config/queue.php文件加载所选连接的配置,然后它找到所选驱动程序的连接器,对其调用connect()方法,最后设置连接名称以供进一步使用。首先从config/queue.php文件中加载配置选择的连接,然后定位到选择的驱动的连接器,调用connect()方法,最后设置连接名称以备后续使用现在我们知道在哪里可以找到push方法是的,当你执行Queue::push()时,你实际上是在你正在使用的队列驱动程序上调用push方法,每个驱动程序以自己的方式处理不同的操作,但Laravel提供你有一个统一的界面,无论你使用什么驱动程序,你都可以用它来给队列管理器指令。是的,当你执行Queue::push()时,你正在使用的队列驱动程序每个驱动程序都以自己的方式处理不同的操作,但是Laravel为你提供了一个统一的接口,你可以使用它来告诉队列管理器你正在使用什么驱动程序.如果我想使用非内置驱动程序怎么办?如果我想使用非内置驱动程序怎么办?很简单,您可以使用自定义驱动程序的名称调用Queue::addConnector()以及解释如何获取与该驱动程序的连接的闭包,同时确保您的连接器实现Queue\Connectors\ConnectorInterface接口。简单来说,您使用自定义驱动程序的名称调用Queue::addConnector(),并使用闭包解释如何获得与该驱动程序的连接,同时确保您的连接器实现了Queue\Connectors\ConnectorInterface接口。注册连接器后,您可以使用任何使用此驱动程序的连接:Queue::connection('my-connection')->push(...);Continueto“PreparingJobsForQueue”Continueto“PreparingJobsFor排队》转载请注明:转载自瑞恩是个菜鸟|LNMP技术栈笔记队列系统初探
