2016-05-17 4 views
1

Использование жрать 6, я тестировал бассейн/Promise асинхронный со следующим кодом:Избегайте пройти по ссылке в жрать 6 Асинхронный пулом

$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 \ Settle, если мы хотим, чтобы игнорировать все отклоненные обещания и ожидания возвращает значение, возвращаемое в результирующем массиве.

+0

Почему вы должны пройти '$ значения' по ссылке в самом первом месте? – revo

+0

@revo, чтобы получить ответ, так как функция возвращает обещания в $ pool. – azngunit81

ответ

1

Я не уверен, что вы пытаетесь сделать точно. Вам необходимо передать $values, чтобы сохранить выполненные запросы, но нет необходимости передавать его по ссылке. Однако, чтобы иметь все ответы в одном месте, вы можете использовать статические 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()); 
} 
Смежные вопросы