延迟从代码排队的 Laravel Artisan 命令

Delay a Laravel Artisan command queued from code

我是 运行 来自我 Laravel 应用程序控制器的 Artisan 命令。 As the docs specify,你可以这样排队:

Artisan::queue('email:send', [
    'user' => 1, '--queue' => 'default'
]);

这会处理队列逻辑,在我的例子中,会将作业发送到 Redis,它几乎会立即得到处理。

我想推迟工作。您 can normally do this 像这样调用队列命令时:

$job = (new SendReminderEmail($user))->delay(60);

$this->dispatch($job);

有没有办法加入这些函数,这样我就可以将我的 Artisan 命令延迟 5 分钟?我假设有一个简单的选项可以延迟它。

如果没有,我可以创建另一个作业 class 以站在我的控制器和 Artisan 命令之间,我可以按正常方式排队并延迟,然后让该作业调用我的 Artisan 命令。但这似乎是一种使它起作用的非常复杂的方法。有没有更好的方法来延迟排队的 Artisan 命令?

谢谢

由于控制台内核使用 "push" 对命令进行排队,这对于 laravel 5.3 及更早版本是不可能的。

然而,您可以向框架发出拉取请求以在内核上实现 "later" 调用,它可以直接传递给队列的 "later" 函数。

或者只是执行一项工作 class,就像您已经说过的那样。

但是您的用例有更好的解决方案。 只需使用 Mail facade:

Mail::later(5, 'emails.welcome', $data, function ($message) {
    //
});

有关文档,请参阅 https://laravel.com/docs/5.2/mail#queueing-mail

您可以使用计划任务来解决问题,该任务将监视电子邮件是否会在所需时间发送。您还可以使用 table 设置电子邮件变量,例如主题、模板、模板变量、发送电子邮件的时间等。