Laravel中的延迟队列可以用作CRON作业的替代方案

Abi*_*hek 1 laravel laravel-4

Laravel 4在队列方面有很多功能.这个问题是关于Queue方法Queue.later() API Documentation的第一个参数delay.

Cron基本上用于执行重复任务.

如果下面的代码片段更具通用性,可配置的时间也可以:

  1. 这可以作为CRON工作的替代品吗?
  2. 假设我们使用IronMQ,这是否是使用失败的安全方法

-

class SendEmail {

    public function fire($job, $data)
    {
    //Connect to SMTP and send email

    $job->delete();

    //Recall the queue with a delay
        Queue::later(60,'SendEmail@send', array('message' => $message));
    }
}


//app/events/MailHandler.php
public class MailHandler(){
    public function onMailListenerStarted(){
        Queue::push('SendEmail@send', array('message' => $message));    
    }
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*aag 5

你必须记住,排队和Cron任务是两件不同的事情.

  • 每隔一分钟就会启动一个cron作业(取决于你如何配置它).
  • 在延迟时间结束后,队列作业将运行并轮到他处理.

因此,为了将其与您对Cron"执行重复任务"的定义进行比较,Queue不会那样做.乔布斯只是在队列中等待,他们什么都不做.延迟的工作将给你的优势是它至少会等到发送它的时间,但它不会尝试一次性发送所有电子邮件.缺点是,它可能需要很长时间才能发送,但为了防止这种情况,您可以简单地使用更多工作程序来处理队列.

并且您需要一个处理队列的脚本,您最有可能希望以cron开头.

我在代码片段中看到的另一个问题是,如果将作业添加回队列时出现问题,作业将丢失,并且永远不会被添加回队列.

那么回答你的问题:

  1. 不,队列不是作业的替代品,但队列确实可以更轻松地在cron脚本中进行数据处理

  2. 理论上,无论您的队列提供程序有多好,这都不是故障安全方法.但是可以创建一些脚本来检查队列是否仍在执行它应该做的一切,但这确实需要一些日志记录(例如,最后一次运行作业时保存).