首页 文章

了解Laravel 5.2上的队列和调度程序

提问于
浏览
2

我正在尝试如何在Laravel上写作业 .

在Laravel文档之后,我创建了一个使用mail:queue发送电子邮件的简单作业 .

我还添加了一个cron作业,它将每分钟调用一次调度程序,然后每5分钟运行一次该作业 .

当我手动运行命令队列时,一切正常:listen .

后来我在调度程序中添加了一个print语句,我发现了一个奇怪的问题 .

每当我运行队列时:从终端监听,我看到日程安排功能内的打印消息,每5秒打印一次 .

所以我的问题是 queue:listen 调用日程安排功能吗?如果是,为什么我们需要添加 schedule:run 作为cron作业?

我使用的代码:

protected function schedule(Schedule $schedule){     
    error_log("inside scheduler");
    $schedule->call(function () {
        dispatch(new \App\Jobs\SendEmail);
    })->everyFiveMinutes();              
}

这是我在终端上运行的命令 .

php artisan queue:listen

我得到的输出(每5秒)
内部调度程序
内部调度程序
内部调度程序......

有人能解释一下这里发生了什么吗?

  • Adding the job code for better understanding
    SendEmail.php
public function handle() {
 //do some task here
 Mail::queue("emails.send_update", [], function($message) {
  $message->to("someone@somedomain.com");
  $message->subject('Status has been updated');
 });
 }

2 回答

  • 5

    队列和调度是不同的事情 .

    Queues 您可以设置在服务器上运行的邮件队列 . 这总是在倾听 . 如果您向邮件队列添加电子邮件,您的队列函数将尽快执行邮件发送:它只是在另一个线程上执行此操作 .

    Scheduling 这是Laravel组织cron工作的一种方式 . Laravel建议您在服务器上设置一个cron命令,每分钟执行一次名为 schedule:run 的命令 . 在此命令中,Laravel然后查看您设置的调度脚本及其条件,并在需要执行时为您执行适当的调度脚本 .

    当涉及到您的邮件任务时:您应该将邮件添加到作业队列中,并将其保留 . 不涉及安排 . 然后在您的服务器上,您将使用 queue:listen 运行队列:当邮件添加到队列时,它将立即发送 .

    在您的服务器上还为任何调度脚本设置了cron命令(如调度:启动调度程序中所述),但您可以忘记已设置了cron . 然后你可以创建自己的调度脚本,以便在特定时间执行,Laravel将为你发挥其魔力 .

    Updated response :在您的SendEmail.php函数中,您需要处理正在发送的邮件的任务:类似于

    public function handle(Mailer $mailer)
    {
        $mailer->send('emails.reminder', ['user' => $this->user], function ($m) {
            //
        });
    }
    

    目前,您每5分钟向队列中添加一个新作业,但您的工作是将电子邮件排队 . 所以你有效地不断排队消息,但从未真正执行过它们 .

  • 0

    queue:listen 将在Kernel.php中部分执行'schedule()'函数,这使得它在代码中定期输出内容 . 将 queue:listen 更改为 queue:work 将解决此问题 .

    有关详细信息,请参阅laravel cannot run scheduled command, while queue:listen run schedule() periodicallyanswer .

相关问题