Intereting Posts
Получить PHP для обновления с каждой строкой, возвращаемой командой оболочки Значения таблицы кэша глобально в laravel Контроллеры пакетов в Laravel 4 Ошибка Laravel Validator из-за преобразования массива в строку Переместить значение атрибута title в значение атрибута класса в HTML-коде Используйте переменные $ _GET, $ _SERVER в Javascript (jQuery / AJAX) Преобразование php curl в GAE urlfetch для iTunes InApp verifyReceipt Не можете вызвать закрытие, завернутое в закрытие? Более чистый способ использования модуля для столбцов Как вызвать php-файл в div? Можете ли вы порекомендовать хорошую разработку графических диаграмм на основе php Gantt? Создание и импорт базы данных mysql на общий хост в php Как создать PHP-приложение с поддержкой нескольких языков (английский, французский, китайский и т. Д.) PHP, как фильтровать массив, который содержит что-то? Выполнить php-код только в том случае, если инструкция javascript верна

Guzzle: загрузка параллельных файлов с использованием пула Guzzle: опция пакетной () и `sink`

Вы можете параллельно выполнять 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