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

时间:2013-07-16 09:47:45

标签: laravel laravel-4

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

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

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

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

    -

    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));    
        }
    }
    

2 个答案:

答案 0 :(得分:5)

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

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

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

你需要一个处理队列的脚本,你最有可能想要用cron开始。

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

所以回答你的问题:

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

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

答案 1 :(得分:0)

.. 2年后..

这会是失败安全方法吗? Laravel Forge已经非常可靠地添加和监督队列工作人员,并且很多减少了痛苦,值得一试。

所以是的,不知道是否安全无故障,但绝对比以前更可靠。