1

Guzzle 6 を使用して、次のコードで Pool/Promise Asynchronous をテストしました。

    $client = new  \GuzzleHttp\Client();
    $urls = [];
    for($i = 1; $i<10; $i++) {
       $urls[] = ''https://httpbin.org/get?id='.$i;
    }    

    $requests = function ($urls){
        if(!empty($urls)) {
            foreach($urls as $uri){
                yield new \GuzzleHttp\Psr7\Request('GET', $uri);
            }
        }
    };
    $values = [];
    $pool = new \GuzzleHttp\Pool($client, $requests($urls), [
        'concurrency' => 5,
        'fulfilled' => function ($response, $index) use (&$values){
            // this is delivered each successful response
            return $values[]=$response->getStatusCode();
        },
        'rejected' => function ($reason, $index){
            // this is delivered each failed request
            //dd($reason);
            return $reason->getResponse();
        },
    ]);

// Initiate the transfers and create a promise
    $promise = $pool->promise();

// Force the pool of requests to complete.
    $promise->wait();
    var_dump($values);

$値を参照渡しせず、$promise->wait();代わりに結果を受け取る方法またはリファクタリングはありますか?

に見られるように: http://guzzle.readthedocs.io/en/latest/quickstart.html#async-requests

拒否された Promise をすべて無視したい場合は、Promise\Settle を実行する方法があり、待機によって結果配列内に返された値が返されます。

4

1 に答える 1

1

あなたが何をしようとしているのか正確にはわかりません。$values満たされたリクエストを保存するには渡す必要がありますが、参照渡しする必要はありません。ただし、すべての応答を 1 か所にまとめるには、クラスの静的batch()メソッドを使用できます。Pool

$responses = Pool::batch($client, $requests(10), [
    'concurrency' => 5,
    'fulfilled' => function ($response, $index) {
    },
    'rejected' => function ($reason, $index) {
    },
]);

Response次に、を反復してクラスのオブジェクトを取得し$responsesます。

foreach ($responses as $response) {
    var_dump($response->getBody()->getContents());
}
于 2016-07-14T21:42:46.943 に答える