Guzzle 异步进程响应,因为它进来
Guzzle Async process response as it comes in
我一直在编写一个脚本,该脚本使用 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();
}
有没有一种方法可以在请求的页面进入时抓取它们,而不是等待所有页面然后抓取。如果可能的话,我是否认为这会加快速度?
提前感谢您的帮助。
可以。 getAsync()
returns 一个承诺,因此您可以使用 ->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()
function instead of settle
. And vote for my PR 可以使用 settle_limit()
;)
我一直在编写一个脚本,该脚本使用 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();
}
有没有一种方法可以在请求的页面进入时抓取它们,而不是等待所有页面然后抓取。如果可能的话,我是否认为这会加快速度?
提前感谢您的帮助。
可以。 getAsync()
returns 一个承诺,因此您可以使用 ->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()
function instead of settle
. And vote for my PR 可以使用 settle_limit()
;)