2016-10-25 4 views
0

Я думал, что следующий код будет работать следующим образом:жрать параллельный запрос, ждать готового пакета перед отправкой следующего

  1. партия в количестве CONCURRENT_REQUESTS это отправить
  2. он не стал ждать, пока все эти просьбы по окончанию
  3. следующей партии вышеуказанного числа, посылает
  4. и так далее

но в Реалите y, если я прокомментирую строку 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

Он не будет работать с 'EveryPromise'. Я изменил это между ними. Вместо этого работает 'new Pool'. – DarsVaeda

+0

Он работает для меня точно так же, как в моем предыдущем сообщении. Точно такой же результат. Используете ли вы модифицированную версию? Разная версия Guzzle? –

Смежные вопросы