1

处理 Laravel 队列,我的理解是作业是保留在队列中要一个接一个执行的任务。

Laravel 文档说:

换句话说,如果您在没有明确定义应该分派到哪个队列的情况下分派作业,则该作业将被放置在连接配置的 queue 属性中定义的队列中:

// 这个作业被发送到默认队列...

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');

4

2 回答 2

1

A1:就像lagbox所说的,Job 是您将创建和调度的任何工作的通用名称。

A2:队列不需要在任何地方定义,你只需要告诉 Laravel 你想向哪个队列分派任务就可以了。例如,如果您调用Job::dispatch()->onQueue('emails');数据库连接,将在队列作业表中创建一个新行(表名jobs默认为),该列queue将填充为emails. 之后,仅当您运行指定电子邮件队列的工作人员时才会执行此作业:php artisan queue:work --queue=emails。如果 config/queue.php 文件中指定的数据库连接的默认队列是 emails 队列,那么在运行 worker 命令时不需要指定队列。

如果您有许多队列,您可以为每个队列创建一个进程,这样您就可以定义您希望如何运行每个作业队列。

于 2020-01-11T23:56:16.260 回答
0

那么在哪里以及如何使用语法 Job:: ?

您可以在任何地方使用它,同时您也可以使用助手dispatch()或实现 traitDispatchesJobs和 call $this->dispatch()。所有这些调用都会起作用,创建你的工作对象并调度它。

Job::dispatch()->onQueue('emails') 中的邮件队列来自哪里??

队列取决于您运行的驱动程序,如果您运行 Horizo​​n,您将需要更改配置(并且仍然启动系统进程)。您是否正在运行其他队列驱动程序,您必须在应该运行它们的服务器上创建队列php artisan queue:work redis --queue=emails

作业也被分派在这些队列中的哪一个,取决于在 onQueue() 调用中指定的队列,为了可维护性和确保作业在正确的队列上运行,我更喜欢将其设置在作业中。

class job implements ShouldQueue {
    public $queue = 'emails';
}
于 2020-01-12T02:48:52.400 回答