2017-09-14 679 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(), [