我正在尝试如何在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 回答
队列和调度是不同的事情 .
Queues 您可以设置在服务器上运行的邮件队列 . 这总是在倾听 . 如果您向邮件队列添加电子邮件,您的队列函数将尽快执行邮件发送:它只是在另一个线程上执行此操作 .
Scheduling 这是Laravel组织cron工作的一种方式 . Laravel建议您在服务器上设置一个cron命令,每分钟执行一次名为
schedule:run
的命令 . 在此命令中,Laravel然后查看您设置的调度脚本及其条件,并在需要执行时为您执行适当的调度脚本 .当涉及到您的邮件任务时:您应该将邮件添加到作业队列中,并将其保留 . 不涉及安排 . 然后在您的服务器上,您将使用
queue:listen
运行队列:当邮件添加到队列时,它将立即发送 .在您的服务器上还为任何调度脚本设置了cron命令(如调度:启动调度程序中所述),但您可以忘记已设置了cron . 然后你可以创建自己的调度脚本,以便在特定时间执行,Laravel将为你发挥其魔力 .
Updated response :在您的SendEmail.php函数中,您需要处理正在发送的邮件的任务:类似于
目前,您每5分钟向队列中添加一个新作业,但您的工作是将电子邮件排队 . 所以你有效地不断排队消息,但从未真正执行过它们 .
queue:listen
将在Kernel.php中部分执行'schedule()'函数,这使得它在代码中定期输出内容 . 将queue:listen
更改为queue:work
将解决此问题 .有关详细信息,请参阅laravel cannot run scheduled command, while queue:listen run schedule() periodically和answer .