2016-10-13 4 views
1

에서 거부 동시 요청에 대한 응답 : http://docs.guzzlephp.org/en/latest/quickstart.html#concurrent-requests액세스 내가 목구멍 동시성 요청 도구를 사용하고 목구멍

내 코드 예제 코드와 유사합니다

use GuzzleHttp\Pool; 
use GuzzleHttp\Client; 
use GuzzleHttp\Psr7\Request; 

$client = new Client(); 

$requests = function ($total) { 
    $uri = 'http://127.0.0.1:8126/guzzle-server/perf'; 
    for ($i = 0; $i < $total; $i++) { 
     yield new Request('GET', $uri); 
    } 
}; 

$pool = new Pool($client, $requests(100), [ 
    'concurrency' => 5, 
    'fulfilled' => function ($response, $index) { 
     // this is delivered each successful response 
    }, 
    'rejected' => function ($reason, $index) { 
     // this is delivered each failed request 
    }, 
]); 

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

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

문제는 내 요청의 일부가 500 HTTP 응답으로 응답을 반환하지만 일부 내용을 계속 전송합니다 (예 : 오류가 발생한 이유). 죄송합니다 유감스럽게도 클래스의 HTTP 응답을 '거부 됨'으로 500 상태 코드와 함께, 그리고 그 매개 변수는 거부 된 기능에 존재하지 않기 때문에 나는 원래의 응답을 얻을 수가 없습니다.

그러나 $reason에 액세스 할 수 있습니다. 이 원래의 응답이 포함되어 있지만

GuzzleHttp\Exception\ServerException: Server error: `GET http://example.com` resulted in a `500 Internal Server Error` response: {"failure_reason":"Useful message"} in [...stacktrace ...]

, 나는 쉽게로 추출 할 수 없습니다 :

{ 
    xdebug: "..." 
} 

xdebug 속성은 같은 보이는 문자열로 HTML을 포함 : 내 경우에는 그렇게 같은 JSON을 포함 그것의 HTML에서 숨겨져있어 매우 유용하지 않습니다. 나는 또한 이것이 어떻게 처음부터 설정되었는지 전혀 모른다.

따라서 제 질문은 거부 된 동시 요청에 대한 응답에 어떻게 액세스 할 수 있습니까?

답변

3

나는 약간의 노력 끝에 결국 내 자신의 질문에 대답했다. $reasonGuzzleException입니다.

따라서 우리는이 예외의 유형 확인과 같이 적절한 논리를 수행 할 수 있습니다 모든 GuzzleException가 응답을 가지고

[ 
    ..., 
    'rejected' => function ($reason, $index) { 
     if ($reason instanceof GuzzleHttp\Exception\ClientException) { 
      $body = $reason->getResponse()->getBody(); 
     } 
    }, 
] 

참고. 자세한 내용은 http://docs.guzzlephp.org/en/latest/quickstart.html#exceptions을 참조하십시오.