2016-10-25 15 views
0

を送信する前に、完成したバッチを待って、同時リクエストをがつがつ食う:私はこの次のコードはこのように動作するだろうと思った次の

  1. CONCURRENT_REQUESTSの数のバッチが、それはこれらの要求のすべてになるまで待っている
  2. を送っています上記の番号の次のバッチが

ではなくrealitで

  • などを送っている
  • を終了しますもし私が行14 [usleep(...)]をコメントすると、要求バッチはできるだけ速くサーバーに何千ものクエリを生成しているようです。 変更することはできますか?この動作を変更するにはどうすればよいですか?

    <?php 
    $pool = $this->getPool(); 
    if (false !== $pool) { 
        $pool->promise()->wait(); 
    } 
    private function getPool() 
    { 
        $requests = function ($data) { 
        foreach ($data as $index => $datum) { 
         yield $this->patch($datum)->then(function (
           $response 
          ) use ($index) { 
           usleep(SLEEP_TIME_IN_SECONDS *1000000); 
           return [ 
            'response' => $response, 
            'index' => $index 
           ]; 
          }); 
         } 
        }; 
        return new EachPromise($requests($data), [ 
         'concurrency' => CONCURRENT_REQUESTS, 
         'fulfilled' => function ($response, $index) use ($data) { 
          // log 
         }, 
         'rejected' => function ($reason, $index) use ($data) { 
          // do stuff 
         } 
        ]); 
    } 
    private function patch($data) 
    { 
        $request = new Request(REQUEST_TYPE_PATCH, $url, $this->getPatchHeaders()); 
        return $this->client->sendAsync($request); 
    } 
    
  • +0

    本当にCurlMultiハンドラを使用していますか? cURLをインストールして有効にしていますか? StreamHandlerでは動作しません。 –

    答えて

    3

    これは同じ意味(意味合い)のコードで私に役立ちます。

    use GuzzleHttp\Client; 
    use function GuzzleHttp\Promise\each_limit; 
    
    $client = new Client(); 
    
    $requests = function() use ($client) { 
        foreach (range(1, 15) as $index) { 
         echo "Starting $index query...\n"; 
    
         yield $client->getAsync('http://google.com/') 
          ->then(function ($response) use ($index) { 
           echo "Request $index completed successfully.\n"; 
    
           return [ 
            'response' => $response, 
            'index' => $index 
           ]; 
          }); 
        } 
    }; 
    
    $promise = each_limit(
        $requests(), 
        3 
        // fulfiled 
        // rejected 
    ); 
    
    $promise->wait(); 
    

    そして結果は次のとおりです。

    Starting 1 query... 
    Starting 2 query... 
    Starting 3 query... 
    Request 3 completed successfully. 
    Starting 4 query... 
    Request 2 completed successfully. 
    Starting 5 query... 
    Request 4 completed successfully. 
    Starting 6 query... 
    Request 1 completed successfully. 
    Starting 7 query... 
    Request 5 completed successfully. 
    Starting 8 query... 
    Request 6 completed successfully. 
    Starting 9 query... 
    Request 7 completed successfully. 
    Starting 10 query... 
    Request 8 completed successfully. 
    Starting 11 query... 
    Request 9 completed successfully. 
    Starting 12 query... 
    Request 10 completed successfully. 
    Starting 13 query... 
    Request 11 completed successfully. 
    Starting 14 query... 
    Request 12 completed successfully. 
    Starting 15 query... 
    Request 13 completed successfully. 
    Request 14 completed successfully. 
    Request 15 completed successfully. 
    

    だから、それが実際に動作します。あなたのコードをもう一度チェックしてください。最新バージョンのGuzzle(6.2.2で試したもの)にアップデートしてみてください。

    +0

    'EachPromise'では動作しません。私はその間に変更しました。代わりに 'new Pool'を使用します。 – DarsVaeda

    +0

    それは私のために、私の以前のメッセージと同じコードを正確に動作します。まったく同じ結果です修正版を使用していますか?グーグルの別のバージョン? –

    関連する問題