Guzzle: параллельная загрузка файлов с использованием опции Guzzle’s Pool: batch () и `sink`

Вы можете выполнять http-запросы параллельно, используя Guzzle’s Pool:batch() метод. Позволяет установить параметры по умолчанию для запросов, используя options введите третий параметр.

Но что если мне понадобятся разные опции для разных запросов в пуле? Я хотел бы выполнять запросы GET, используя пул, и передавать каждый ответ в отдельный файл на диске. Eсть sink вариант для этого. Но как применить разные значения этой опции к запросам?

2

Решение

Пример Растора является почти верно, но это неправильно реализовано если вы хотите предоставить «варианты» Pool() конструктор.

Он упускает критическую реализацию упомянутого массива параметров пула Вот.

Документы Guzzle говорят:

Когда функция получается из итератора, она предоставляется
массив «request_options», который должен быть объединен поверх любого
существующие опции, и функция ДОЛЖНА тогда возвращать ожидающий
Обещаю.

Кроме того, если вы посмотрите на Pool() Код ниже комментария, с которым я связан, вы можете видеть, что пул Guzzle вызывает вызываемый объект и дает ему «параметры» пула в качестве аргумента, чтобы вы могли применить его к вашему запросу.

Правильный приоритет

Параметры по запросу> Параметры пула> Клиентские настройки по умолчанию.

если ты не применить Pool() массив опций объекта для ваших объектов запроса, вы получите серьезные ошибки, например, если вы попытаетесь сделать new Pool($client, $requests(100), ['options'=>['timeout'=>30.0]]);, Без моего исправленного кода ваши параметры пула не будут применяться вообще, так как вы не поддерживал слияние параметров пула должным образом и поэтому просто отбрасывал их.

Так Вот правильный код с поддержкой Pool() опции:

<?php

$client = new \GuzzleHttp\Client();

$requests = function ($total) use ($client) {
for ($i = 0; $i < $total; $i++) {
$url = "domain.com/picture/{$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() конструктор. В этом случае вы можете просто посмотреть на официальные документы по жадности для примера.

Официальный пример выглядит следующим образом:

// Using a closure that will return a promise once the pool calls the closure.
$client = new Client();

$requests = function ($total) use ($client) {
$uri = '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

Другие решения

Для жрет 6

$client = new \GuzzleHttp\Client();

$requests = function ($total) use ($client) {
for ($i = 0; $i < $total; $i++) {
$url = "http://domain.com/picture/{$i}.jpg";
$filepath = "/tmp/{$i}.jpg";

yield function() use ($client, $url, $filepath) {
return $client->getAsync($url, [
'sink' => $filepath
]);
};
}
};

$pool = new Pool($client, $requests(100));
0

Вы можете указать $options Вы хотите на запросы индивидуально. Он будет применяться только ко всем запросам, если вы передадите его клиенту. Вот выдержка из документа Guzzle 6:

Заголовки могут быть добавлены в качестве параметров по умолчанию при создании клиента. когда
Заголовки используются в качестве параметров по умолчанию, они применяются только в том случае, если
создаваемый запрос еще не содержит определенного заголовка.
Это включает в себя как запросы, переданные клиенту в send (), так и
методы и запросы sendAsync (), созданные клиентом (например,
request () и requestAsync ()).

Увидеть http://guzzle.readthedocs.org/en/latest/request-options.html?highlight=default#headers

0
По вопросам рекламы [email protected]