10

我目前有一个预定的控制台命令,每 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

4

2 回答 2

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

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

于 2016-03-12T11:13:14.753 回答
1

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

  • 检索输入

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

  • 检索命令参数的值

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

  • 检索所有参数

$arguments = $this->argument();

  • 检索命令选项的值

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

  • 检索所有选项

$options = $this->option();

资源

于 2016-03-17T16:28:05.980 回答