2017-12-19 16 views
1

私はGuzzleを使用してSOAP APIを使用しています。私は6つの要求をしなければならないが、将来的にはこれは不確定な要求でもあるかもしれない。Guzzleが同期要求を送信しています

問題は非同期ではなく、同期を送信しているという問題です。それ自身のすべての要求は+ 2.5秒かかります。

私は、Guzz、$ promisesを持つ固定配列のもの、さらにはプールを使ってすべての例を試してみました(これは私が試したものです)私は最終的に必要です)。すべてを1ファイル(機能)に入れると、合計のタイミングを5-6秒に戻すことができます(これは問題ありません)。しかし、私がオブジェクトと機能のすべてを何とか入れたら、Guzzleはそれらを再び同期させることにします。

Checks.php:

public function request() 
    { 
     $promises = []; 
     $promises['requestOne'] = $this->requestOne(); 
     $promises['requestTwo'] = $this->requestTwo(); 
     $promises['requestThree'] = $this->requestThree(); 
     // etc 

     // wait for all requests to complete 
     $results = \GuzzleHttp\Promise\settle($promises)->wait(); 

     // Return results 
     return $results; 
    } 

    public function requestOne() 
    { 
     $promise = (new API\GetProposition()) 
      ->requestAsync(); 
     return $promise; 
    }    

    // requestTwo, requestThree, etc 

API \ GetProposition.php

public function requestAsync() 
{ 
    $webservice = new Webservice(); 
    $xmlBody = '<some-xml></some-xml>'; 
    return $webservice->requestAsync($xmlBody, 'GetProposition'); 
} 

Webservice.php

public function requestAsync($xmlBody, $soapAction) 
{ 
    $client = new Client([ 
     'base_uri' => 'some_url', 
     'timeout' => 5.0 
    ]); 

    $xml = '<soapenv:Envelope> 
     <soapenv:Body> 
      '.$xmlBody.' 
     </soapenv:Body> 
    </soapenv:Envelope>'; 

    $promise = $client->requestAsync('POST', 'NameOfService', [ 
     'body' => $xml, 
     'headers' => [ 
      'Content-Type' => 'text/xml', 
      'SOAPAction' => $soapAction, // SOAP Method to post to 
     ], 
    ]); 

    return $promise; 
} 

私が変更d XMLと省略形のいくつかのパラメータ。なぜなら、私はそのAPIのために必要なすべての準備をしている間にWebサービスクラスを持っているからです。ほとんどのAPIには、呼び出すことのできる複数のメソッド/アクションがあります。 API \ GetProposition。

->wait()の前に、私はすべての$約束が保留中であることを見ることができます。したがって、非同期を送信しているように見えます。 ->wait()の後、彼らはすべて達成されました。

パフォーマンスはマイナスです。 6つの要求はすべて2.5から最大3秒を要しません。

誰かが助けてくれることを願っています。

ニック

答えて

0

問題は、すべてのリクエストで$ clientオブジェクトが作成されたことでした。カールマルチカールがどのハンドラを使用するかを知ることができないようにする。 答えはhttps://stackoverflow.com/a/46019201/7924519で見つかりました。

関連する問題