5

我正在从我的 Laravel 应用程序中的控制器运行 Artisan 命令。正如文档指定的那样,您可以像这样排队:

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

这会处理队列逻辑,并且在我的情况下,将作业发送到 Redis,在那里它几乎立即得到处理。

我想推迟工作。您通常可以在调用队列命令时执行此操作,如下所示:

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

$this->dispatch($job);

有没有办法加入这些功能,这样我就可以将我的 Artisan 命令延迟 5 分钟?我认为有一个简单的选择来延迟它。

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

谢谢

4

2 回答 2

1

由于控制台内核使用“推送”来排队命令,这对于 laravel 5.3 及更早版本是不可能的。

但是,您可以向框架发出拉取请求以在内核上实现“稍后”调用,这可以直接传递给队列的“稍后”函数。

或者只是实现一个工作类,就像你已经说过的那样。

但是对于您的用例,有一个更好的解决方案。只需使用 Mail 门面:

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

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

于 2016-08-26T11:44:46.513 回答
0

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

于 2017-08-14T15:55:01.400 回答