延迟从代码排队的 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) {
//
});
您可以使用计划任务来解决问题,该任务将监视电子邮件是否会在所需时间发送。您还可以使用 table 设置电子邮件变量,例如主题、模板、模板变量、发送电子邮件的时间等。
我是 运行 来自我 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) {
//
});
您可以使用计划任务来解决问题,该任务将监视电子邮件是否会在所需时间发送。您还可以使用 table 设置电子邮件变量,例如主题、模板、模板变量、发送电子邮件的时间等。