我一直在研究一个使用getAsync和Promise \ Settle接近一千个异步请求的脚本。每个页面都请求它然后使用Symphony爬虫过滤器方法进行解析(也很慢但是单独的问题。)
我的代码看起来像这样:
$requestArray = [];
$request = new Client($url);
foreach ($thousandItemArray as $item) {
$requestArray[] = $request->getAsync(null, $query);
}
$results = Promise\settle($request)->wait(true);
foreach ($results as $item) {
$item->crawl();
}
有没有办法可以抓取所请求的页面,而不是等待所有页面然后爬行。我认为如果可能的话,这会加快速度吗?
提前感谢您的帮助。
答案 0 :(得分:2)
你可以。 getAsync()
会返回一个承诺,因此您可以使用->then()
为其分配操作。
$promisesList[] = $request->getAsync(/* ... */)->then(
function (Response $resp) {
// Do whatever you want right after the response is available.
}
);
$results = Promise\settle($request)->wait(true);
P.S。
可能您希望将并发级别限制为一定数量的请求(不是一次启动所有请求)。如果是,请使用each_limit()
功能代替settle
。并投票my PR以便能够使用settle_limit()
;)