【发布时间】:2016-06-24 17:20:28
【问题描述】:
我目前有一个计划的控制台命令,它每 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?
【问题讨论】:
-
你可以发布你的命令类吗?它从哪些类扩展而来?
-
大概有 500 行长,所以可能不应该在这里粘贴整个内容。它扩展了
Command类。 -
您打算如何运行多个队列侦听器并跨作业分块您的页面?
标签: php laravel laravel-5 laravel-scheduler