与Laravel队列打交道,我了解的工作是保留在队列中以一个接一个地执行的任务。
Laravel文档说:
换句话说,如果您在未明确定义的情况下调度作业应该将其分派到哪个队列,作业将被放置在在连接的队列属性中定义的队列配置:
//此作业已发送到默认队列...
Job::dispatch();
//此作业已发送到“电子邮件”队列...
Job::dispatch()->onQueue('emails');
在同一文档页面的另一个地方,我找到:
ProcessPodcast::dispatch($podcast);
ProcessPodcast
是此处的作业,正在使用参数$podcast
进行分派。但是在文档中,除了上述两行,我都找不到语法Job::
。
Q1)那么在哪里以及如何使用语法Job::
?
connections
内config/queue.php
数组中的每个元素都有'queue' => 'default',
。
Q2) emails
队列来自Job::dispatch()->onQueue('emails');
的哪里?
A1:就像lagbox所说的,Job是您要创建和分发的任何作业的通用名称。
A2:不需要在任何地方定义队列,只需告诉Laravel wich队列,您就可以将作业分派到该队列。例如,如果您为数据库连接调用Job::dispatch()->onQueue('emails');
,则将在队列作业表中创建一个新行(表名称默认为jobs
),并且queue
列将填充为emails
。之后,仅当您运行一个指定电子邮件队列为php artisan queue:work --queue=emails
的工作程序时,才会执行此作业。如果config / queue.php文件中指定的数据库连接的默认队列是电子邮件队列,则在运行worker命令时不需要指定队列。
如果队列很多,则可以为每个队列创建一个进程,因此您可以定义运行每个作业队列的方式。
那么在哪里以及如何使用语法Job ::?
您可以在任何地方使用它,也可以使用助手dispatch()
或实现特征DispatchesJobs
并调用$this->dispatch()
。所有这些调用将起作用,创建您的作业对象并将其分派。
电子邮件队列来自Job :: dispatch()-> onQueue('emails'); ?
队列取决于您运行的驱动程序,如果您运行的是Horizon,则将需要更改配置(并仍然启动系统进程)。您是否正在运行其他队列驱动程序,则必须在应运行它们的服务器上创建队列php artisan queue:work redis --queue=emails
。
[这些作业中也分配了哪些队列,取决于在onQueue()调用中指定了哪个队列,为了可维护性和确保作业在正确的队列上运行,我更喜欢将其设置在作业上。
class job implements ShouldQueue {
protected $queue = 'emails';
}