Laravel运行多个计划任务

zen*_*zen 10 php laravel laravel-5 laravel-scheduler

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

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

所以它工作得很好,但是我目前有大约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')
Run Code Online (Sandbox Code Playgroud)

但是如何在Command班级中阅读该参数?它只是成为一个常规的PHP变量,即$sequence

Shy*_*rma 7

  1. 最好使用队列进行作业处理
  2. 在cron上,将所有作业添加到队列中
  3. 运行多个队列工作程序,它们将并行处理作业

提示:它发生在我们身上.可能会发生之前添加的作业未完成,但cron再次在队列中添加相同的任务.由于队列按顺序工作.为了避免这种情况,您应该在上次完成任务时在数据库中标记,这样您就知道何时执行该作业(如果它被严重延迟)

  • @zen yes这正是Shyam所说的 - 只要过程中的'检查'部分快速简便(你甚至可以在几秒钟内检查这些未来的10000页),那么预定的命令应该每次检查5分钟并添加需要"刷新"到队列的任何页面.然后,您的5或10个队列工作人员将能够并行运行这些刷新操作.如果队列中没有任何内容,他们将"睡觉",因此开销很小,如果队列中有很多东西,他们将一次处理一个(乘以你拥有的工人数). (2认同)
  • 为此,您需要查看可用于运行命令的实用程序,并在它们死亡时保持活动状态.目前的首选工具是Supervisor.FWIW我最近才第一次在Laravel中使用队列,而且体验并不好,因为有多种方法可以运行它们.最后我想发现一个队列工作者(设置为守护进程模式 - 与我可能添加的真正Linux守护进程不同)使用Supervisor保持"活着"对我来说是最好的. (2认同)