Laravel运行多个定时任务

Laravel run multiple scheduled tasks

我目前有一个预定的控制台命令,该命令每 5 分钟 运行s 一次,不会像这样重叠:

 $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 条记录,依此类推。

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

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

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

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

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

我在文档中找到了这个,希望这就是您要找的:

  • Retrieving Input

While your command is executing, you will obviously need to access the values for the arguments and options accepted by your application. To do so, you may use the argument and option methods:

  • Retrieving The Value Of A Command Argument

$value = $this->argument('name');

  • Retrieving All Arguments

$arguments = $this->argument();

  • Retrieving The Value Of A Command Option

$value = $this->option('name');

  • Retrieving All Options

$options = $this->option();

source