Вы можете выполнять http-запросы параллельно, используя Guzzle’s Pool:batch()
метод. Позволяет установить параметры по умолчанию для запросов, используя options
введите третий параметр.
Но что если мне понадобятся разные опции для разных запросов в пуле? Я хотел бы выполнять запросы GET, используя пул, и передавать каждый ответ в отдельный файл на диске. Eсть sink
вариант для этого. Но как применить разные значения этой опции к запросам?
Пример Растора является почти верно, но это неправильно реализовано если вы хотите предоставить «варианты» 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
$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));
Вы можете указать $options
Вы хотите на запросы индивидуально. Он будет применяться только ко всем запросам, если вы передадите его клиенту. Вот выдержка из документа Guzzle 6:
Заголовки могут быть добавлены в качестве параметров по умолчанию при создании клиента. когда
Заголовки используются в качестве параметров по умолчанию, они применяются только в том случае, если
создаваемый запрос еще не содержит определенного заголовка.
Это включает в себя как запросы, переданные клиенту в send (), так и
методы и запросы sendAsync (), созданные клиентом (например,
request () и requestAsync ()).
Увидеть http://guzzle.readthedocs.org/en/latest/request-options.html?highlight=default#headers