新しいGuzzleに関連する更新プログラムguzzhttp/guzzle
並行/並行呼び出しは、約束を含むいくつかの異なる方法で実行されます。Concurrent Requests
RequestInterfacesの配列を渡す古い方法はもはや機能しません。
更新例ここ
$newClient = new \GuzzleHttp\Client(['base_uri' => $base]);
foreach($documents->documents as $doc){
$params = [
'language' =>'eng',
'text' => $doc->summary,
'apikey' => $key
];
$requestArr[$doc->reference] = $newClient->getAsync('/1/api/sync/analyze/v1?' . http_build_query($params));
}
$time_start = microtime(true);
$responses = \GuzzleHttp\Promise\unwrap($requestArr); //$newClient->send($requestArr);
$time_end = microtime(true);
$this->get('logger')->error(' NewsPerf Dev: took ' . ($time_end - $time_start));
を参照してください: コメントで提案されているとの@ sankalp-tambeで尋ねたとして、あなたはまたして同時リクエストのセットを回避するために異なるアプローチを使用することができます失敗するとすべての応答が返されません。
プールで提案されているオプションは実現可能ですが、私はまだ約束を優先します。
例では、unwrapの代わりにsettleおよびwaitメソッドを使用します。上記の例から
違いは、私があまりにも$応答を処理する方法の参考のために、以下の完全な例を作成しました
$responses = \GuzzleHttp\Promise\settle($requestArr)->wait();
だろう。
require __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\Promise as GuzzlePromise;
$client = new GuzzleClient(['timeout' => 12.0]); // see how i set a timeout
$requestPromises = [];
$sitesArray = SiteEntity->getAll(); // returns an array with objects that contain a domain
foreach ($sitesArray as $site) {
$requestPromises[$site->getDomain()] = $client->getAsync('http://' . $site->getDomain());
}
$results = GuzzlePromise\settle($requestPromises)->wait();
foreach ($results as $domain => $result) {
$site = $sitesArray[$domain];
$this->logger->info('Crawler FetchHomePages: domain check ' . $domain);
if ($result['state'] === 'fulfilled') {
$response = $result['value'];
if ($response->getStatusCode() == 200) {
$site->setHtml($response->getBody());
} else {
$site->setHtml($response->getStatusCode());
}
} else if ($result['state'] === 'rejected') {
// notice that if call fails guzzle returns is as state rejected with a reason.
$site->setHtml('ERR: ' . $result['reason']);
} else {
$site->setHtml('ERR: unknown exception ');
$this->logger->err('Crawler FetchHomePages: unknown fetch fail domain: ' . $domain);
}
$this->entityManager->persist($site); // this is a call to Doctrines entity manager
}
このコード例は、もともとはhereと掲載されていました。
ドキュメントに[このデモ](http://guzzlephp.org/http-client/client.html#sending-requests-in-parallel)があります。これは、あなたの視点からはまだ同期呼び出しですが、内部的には並列になります。したがって、呼び出しの合計時間は、1つの最も長いフェッチの時間になります。 – halfer