2017-09-14 677 views
3

我需要在以下情況下的幫助: 我必須發送POST請求到API端點,它可以同時處理請求。但每個都需要時間。爲了減少時間,我想一次發送多個POST請求。如何使用Guzzle執行併發POST請求?

下面是一些代碼片斷:

use GuzzleHttp\Pool as GuzzlePool; 
use GuzzleHttp\Client as GuzzleClient; 
use GuzzleHttp\Psr7\Request as GuzzleRequest; 

[...]

foreach ($aRequestParams as $sRequestParam) { 
    $aRequestList[] = new GuzzleRequest('POST', $sRoute, 
    [ 
// 'form_params' => [ 
//   'jsonString' => $sRequestParam 
//  ] 
     'body' => $sRequestParam 
//  'multipart' => [ 
//   [ 
//    'name' => 'jsonString', 
//    'contents' => $sRequestParam 
//   ] 
//  ] 
    ] 
    ); 
} 
$oGuzzlePool = new GuzzlePool(new GuzzleClient(), $aRequestList, [ 
    'concurrency' => 8, 
    'fulfilled' => [$this, 'processFulfilledCallback'], 
    'rejected' => [$this, 'processRejectedCallback'] 
]); 

$oPromise = $oGuzzlePool->promise(); 
$oPromise->wait(); 

回調函數所請求之後稱爲,但存在的POST負載丟失。我該如何配置GuzzleRequest?

回答

0

我用這個代碼,它似乎工作:

$oGuzzleClient = new GuzzleClient(); 
    $aRequestList = function() use ($oGuzzleClient, $aRequestParams, $sRoute) { 
        foreach ($aRequestParams as $sRequestParam) { 
         yield function() use ($oGuzzleClient, $sRequestParam, $sRoute) { 
          return $oGuzzleClient->postAsync($sRoute, [ 
           'form_params' => [ 
            'jsonString' => $sRequestParam 
           ] 
          ]); 
         }; 
        } 
       }; 
$oGuzzlePool = new GuzzlePool($oGuzzleClient, $aRequestList(), [