首页 文章

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

提问于
浏览
5

我在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分钟?我认为有一个简单的选择来延迟它 .

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

谢谢

2 回答

  • 1

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

  • 0

    由于控制台内核使用“push”对命令进行排队,因此对于laravel 5.3及更早版本而言这是不可能的 .

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

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

    但是对于您的用例有一个更好的解决方案 . 只需使用邮件门面:

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

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

相关问题