2016-05-17 14 views
1

Arbeiten mit Guzzle 6 habe ich den Pool/Versprechen Asynchronous mit dem folgenden Code getestet:Vermeiden Pass durch Bezugnahme in Guzzle 6 Asynchrone von Pool

$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); 

Gibt es eine Möglichkeit oder ein Refactoring, die mir ermöglichen wird, nicht auf die $ -Werte verweisen und stattdessen die Ergebnisse von $promise->wait(); erhalten?

Wie in gesehen: http://guzzle.readthedocs.io/en/latest/quickstart.html#async-requests

Es gibt einen Weg Versprechen \ Settle zu tun ist, wenn wir den Wert innerhalb des Ergebnisses Array zurückgegeben wird wieder alle abgelehnt Versprechungen und die Wartezeit ignorieren wollen.

+0

Warum sollten Sie '$ passieren Werte "durch Bezugnahme auf den allerersten Platz? – revo

+0

@revo, um die Antwort zurück zu bekommen, da die Funktion die Versprechen in $ Pool zurückgibt. – azngunit81

Antwort

1

Ich bin mir nicht sicher, was Sie genau machen wollen. Sie müssen $values übergeben, um die erfüllten Anfragen zu speichern, aber Sie müssen sie nicht als Referenz übergeben. Allerdings haben alle Antworten in einem Ort, den Sie statischen batch() Methode der Pool Klasse verwenden:

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

Dann haben Sie ein Objekt von Response Klasse von iterieren $responses:

foreach ($responses as $response) { 
    var_dump($response->getBody()->getContents()); 
}