Вы можете параллельно выполнять HTTP-запросы, используя метод Guzzle's pool Pool:batch()
. Он позволяет вам устанавливать параметры по умолчанию для запросов с помощью ключа options
в третьем параметре.
Но что, если мне нужны разные варианты для разных запросов в пуле? Я хотел бы выполнить запросы GET с помощью пула и передать каждый ответ на другой файл на диске. Для этого есть опция sink
. Но как применять разные значения этой опции к запросам?
Пример Rastor почти прав, но неправильно реализован, если вы хотите предоставить «опции» конструктору Pool (). Ему не хватает критической реализации массива опций пула, упомянутого здесь: https://github.com/guzzle/guzzle/blob/master/src/Pool.php#L16
В документах Guzzle говорится: «Когда функция передается итератором, функции предоставляется массив« request_options », который должен быть объединен поверх любых существующих опций, и функция ДОЛЖНА затем вернуть ожидающее обещание».
И если вы посмотрите на код Pool () ниже комментария, к которому я привязан, вы можете увидеть, что пул Гузлл вызывает вызываемый и дает ему «параметры» пула в качестве аргумента, именно так, что вы должны применить его к вашему запросу ,
Правильный приоритет – параметры для запроса> Параметры пула> По умолчанию для Клиента.
Если вы не применяете массив параметров объекта Pool () к объектам запроса, вы получите серьезные ошибки, например, если вы попробуете создать новый пул ($ client, $ request (100), ['options' = > [ 'тайм-аут' => 30.0]]);». Без моего исправленного кода ваши параметры Pool не будут применяться вообще, так как вы не поддерживали правильное слияние параметров пула и, следовательно, просто закончили их отбрасывание.
Итак, вот правильный код с поддержкой опций Pool ():
<?php $client = new \GuzzleHttp\Client(); $requests = function ($total) use ($client) { for ($i = 0; $i < $total; $i++) { $url = "http://img.ruphp.com/php/{$i}.jpg"; $filepath = "/tmp/{$i}.jpg"; yield function($poolOpts) use ($client, $url, $filepath) { /** Apply options as follows: * Client() defaults are given the lowest priority * (they're used for any values you don't specify on * the request or the pool). The Pool() "options" * override the Client defaults. And the per-request * options ($reqOpts) override everything (both the * Pool and the Client defaults). * In short: Per-Request > Pool Defaults > Client Defaults. */ $reqOpts = [ 'sink' => $filepath ]; if (is_array($poolOpts) && count($poolOpts) > 0) { $reqOpts = array_merge($poolOpts, $reqOpts); // req > pool } return $client->getAsync($url, $reqOpts); }; } }; $pool = new Pool($client, $requests(100));
Обратите внимание, однако, что вам не нужно поддерживать параметры Pool (), если вы знаете, что вы НИКОГДА, НИКОГДА не добавляйте какие-либо параметры в свой конструктор «new Pool ()». В этом случае вы можете просто посмотреть официальные документы Guzzle для примера: http://docs.guzzlephp.org/en/latest/quickstart.html?highlight=pool#concurrent-requests
Официальный пример выглядит следующим образом:
// Using a closure that will return a promise once the pool calls the closure. $client = new Client(); $requests = function ($total) use ($client) { $uri = 'http://127.0.0.1:8126/guzzle-server/perf'; for ($i = 0; $i < $total; $i++) { yield function() use ($client, $uri) { return $client->getAsync($uri); }; } }; $pool = new Pool($client, $requests(100));
Для жрать 6
$client = new \GuzzleHttp\Client(); $requests = function ($total) use ($client) { for ($i = 0; $i < $total; $i++) { $url = "http://img.ruphp.com/php/{$i}.jpg"; $filepath = "/tmp/{$i}.jpg"; yield function() use ($client, $url, $filepath) { return $client->getAsync($url, [ 'sink' => $filepath ]); }; } }; $pool = new Pool($client, $requests(100));
Вы можете указать $ options, которые вы хотите в запросах индивидуально. Он будет применяться только ко всем запросам, если вы передадите его клиенту. Вот выдержка из документа dud:
При создании клиента заголовки могут быть добавлены в качестве параметров по умолчанию. Когда заголовки используются в качестве параметров по умолчанию, они применяются только в том случае, если создаваемый запрос еще не содержит конкретного заголовка. Это включает в себя как запросы, переданные клиенту в методах и запросах send () и sendAsync (), созданных клиентом (например, request () и requestAsync ()).
См. http://guzzle.readthedocs.org/ru/latest/request-options.html?highlight=default#headers