2016-04-01 18 views
2

:Zaman aşımı sınırları ile eşzamanlı istek göndermek için guzzle'ı nasıl kullanabilirim? Böyle eşzamanlı istekleri göndermek için guzzle 6 kullanıyorum

public function sendConcurrentRequests() { 

    $client = new Client(['timeout' => 5]); 

    $promises[] = $client->getAsync('http://example.com/1'); 
    $promises[] = $client->getAsync('http://example.com/2'); 
    $promises[] = $client->getAsync('http://example.com/3'); 

    $results = Promise\unwrap($promises); 

    return $results; 
} 
Her istek 1 ila 10 saniye sürebiliyor, ama ben en fazla 5 saniye bekleyin taleplerinin hiçbirini istemiyorum

(bu yüzden zaman aşımı ayarlıyorum). Ne olur umuyorum şudur:

  • İsteği 1, 2 ve 3 isteği iptal edilir böylece Talebi 2, en fazla 5 saniye sürer
  • başlatılır ve isteklerini 1 ve 3 numaralı tepkiler, hangi 'Talebi 2 en fazla 3 saniye sürer, bu nedenle unwrap işlevi ConnectException atar ve elimden - talep 1, 2 ve 3 başlatılır - : zamanında,

döndürülür yanıt verdi Bu gerçekten oluyor ne 1 ve 3 numaralı istemlerden yanıt alın.

Bu çalışmayı, zaman içinde gönderilen isteklerden geçerli yanıtları alabilmem için nasıl yapabilirim?

cevap

3

Soruyu yazmayı bitirmeden önce cevabı buldum, ancak başka birine yardımcı olması durumunda yine de yayınlayacağımı düşündüm. size izin veren bir söz reddedilmesi halinde settle işlevi bir istisna olmayacaktır

$results = Promise\settle($promises)->wait(true);

: Bununla

$results = Promise\unwrap($promises);

:

çözüm bu çağrıyı değiştirmekti Tam yanıt dizisini (hem tamamlanmış hem de reddedilen yanıtlarla) alın.

+0

Farkı başka bir örnekle açıklamak isteyen herkes için: http://docs.guzzlephp.org/en/latest/quickstart.html?highlight=promise#concurrent-requests –

+1

Bu özellik, söz konusu olduğunda belgelenmemiş soru yayınlandı, bu yüzden dokümanlar için ekledim: D https://github.com/guzzle/guzzle/commit/812f3a83e5de84a089369ce07452fa9d45d2dd1d – kenske

İlgili konular