【问题标题】:Laravel - understanding Job conceptLaravel - 理解工作概念
【发布时间】:2020-01-11 20:04:48
【问题描述】:

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

Laravel 文档说:

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

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

Job::dispatch();

// 这个作业被发送到“电子邮件”队列...

Job::dispatch()->onQueue('emails');

在同一个文档页面的另一个地方,我发现:

 ProcessPodcast::dispatch($podcast);

ProcessPodcast 是这里的一个工作,它带有一个参数,即$podcast。但在文档中我没有找到语法 Job:: 除了提到的 2 行。

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

config/queue.php 内的connections 数组中的每个元素都有'queue' => 'default',

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

【问题讨论】:

  • 您实际上是在展示一个使用该语法的示例...ProcessPodcast::.... 这是一个工作。在示例中,Job 是您创建的工作类别的占位符
  • 行中的 Job:: 似乎是一个特殊的门面。文档应该更明确吗?
  • 它不是门面......没有名为 Job 的门面......这是一个通用词,就像说 Class,你命名你的工作而不是 laravel,他们不知道什么你的工作被调用,你必须推断你自己的类
  • 我的意思是它似乎是一个门面,而实际上不是。
  • 它称为静态方法调用,它只是 PHP ......就像你对模型使用静态方法调用一样,它们不是外观

标签: laravel queue jobs laravel-queue laravel-jobs


【解决方案1】:

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

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

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

【讨论】:

  • 注意使用 laravel Horizo​​n,你可以在配置中指定你有哪些队列 :)
【解决方案2】:

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

您可以在任何地方使用它,同时您也可以使用帮助器dispatch() 或实现特征DispatchesJobs 并调用$this->dispatch()。所有这些调用都会起作用,创建您的作业对象并分派它。

Job::dispatch()->onQueue('emails') 中的邮件队列从何而来; ?

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

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

class job implements ShouldQueue {
    public $queue = 'emails';
}

【讨论】:

  • ` protected $queue = 'emails';` - 它在 Laravel 文档中的什么位置?
  • 取自源代码,laravel 文档有助于开始,但有时检查它是一个好习惯github.com/illuminate/bus/blob/…。或者,您可以在作业的构造函数中调用 onQueue('emails')。
  • 你提到的文档有public $queue;而不是protected $queue
  • 哦,是的,在“我记得”中再次在构造函数中调用 onQueue 替代调用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多