Laravel运行多个计划任务

时间:2016-03-10 02:57:49

标签: php laravel laravel-5 laravel-scheduler

我目前有一个预定的控制台命令,每5分钟运行一次,没有重叠,如下所示:

 $schedule->command('crawler')
             ->everyFiveMinutes()
             ->withoutOverlapping()
             ->sendOutputTo('../_laravel/storage/logs/scheduler-log.txt');

所以它工作得很好,但我目前有大约220个页面需要大约3个小时才能以5分钟的增量完成,因为我只是强制它每隔一段时间抓取10个页面,因为每个页面需要20-30秒才能爬行由于各种因素。每个页面都是数据库中的记录。如果我最终要抓取10,000个页面,这种方法将无法运行,因为它需要超过24小时,而且每个页面应该每天重新抓取一次。

因此,我的供应商最多允许10个并发请求(或更高版本的更高计划),那么同时运行它的最佳方式是什么?如果我只是复制调度程序代码,它是否会运行相同的命令两次或者如果我重复它10次运行10次?任何会导致的问题?

然后我需要将参数传递给控制台,例如1,2,3等...我可以用它来确定要爬行的页面?即1将是1-10个记录,2将是接下来的11-20个记录,依此类推。

使用这个StackOverfow答案,我想我知道如何传递它,就像这样:

 $schedule->command('crawler --sequence=1')

但是如何在Command课程中阅读该参数?它是否只是一个常规的PHP变量,即$sequence

2 个答案:

答案 0 :(得分:7)

  1. 最好使用队列进行作业处理
  2. 在cron上,将所有作业添加到队列
  3. 运行多个队列工作程序,它们将并行处理作业
  4. 提示:它发生在我们身上。 可能会发生之前添加的作业未完成,但cron再次在队列中添加相同的任务。由于队列按顺序工作。为了避免这种情况,您应该在上次完成任务时在数据库中标记,这样您就知道何时执行该作业(如果它被严重延迟)

答案 1 :(得分:1)

我在文档中发现了这一点,我希望这是您正在寻找的内容:

  
      
  • 检索输入
  •   
     

当您的命令正在执行时,您显然需要访问   应用程序接受的参数和选项的值。至   这样做,您可以使用参数和选项方法:

     
      
  • 检索命令参数的值
  •   
     

$ value = $ this->参数(' name');

     
      
  • 检索所有参数
  •   
     

$ arguments = $ this-> argument();

     
      
  • 检索命令的值   选项
  •   
     

$ value = $ this->选项(' name');

     
      
  • 检索所有选项
  •   
     

$ options = $ this-> option();

source