Guzzle 6.3 Асинхронный пул: обновление списка запросов пула изнутри выполненного обратного вызова обещания? - PullRequest
0 голосов
/ 05 мая 2019

Я работаю над процессом, в котором у меня есть Очередь , и я начинаю с известной единицы работы.Когда я обрабатываю единицу работы, это приведет к нулю или более (неизвестным) единицам работы, которые будут добавлены в Очередь .Я продолжаю обрабатывать очередь до тех пор, пока не останется больше работы.

Я работаю над проверкой концепции , используя Guzzle, где я принимаю первый URL для заполнения очереди,затем обработайте тело ответа, которое может привести к большему количеству URL, которые необходимо обработать.Моя цель - добавить их в очередь и заставить Guzzle продолжать обрабатывать их, пока в очереди ничего не останется.

В других случаях я могу определить переменную как очередь и передать ее по ссылке вфункция, так что он обновляется с новой работой.Но в случае с Guzzle Async Pools (который я считаю наиболее эффективным способом справиться с этим), кажется, нет ясного способа обновить очередь в процессе и выполнить пулзапросы.

Предоставляет ли Guzzle встроенный подход для обновления списка запросов пула из выполненного обратного вызова Promise ?

use ArrayIterator;
use GuzzleHttp\Promise\EachPromise;
use GuzzleHttp\TransferStats;
use Psr\Http\Message\ResponseInterface;

// Re-usable callback which prints the URL being requested
function onStats(TransferStats $stats) {
    echo sprintf(
        '%s (%s)' . PHP_EOL,
        $stats->getEffectiveUri(),
        $stats->getTransferTime()
    );
}

// The queue of work to be performed
$requests = new ArrayIterator([
    $client->get('http://httpbin.org/anything', [
        'on_stats' => 'onStats',
    ])
]);

// Process the queue, which results in more work to be performed
$p = (new EachPromise($requests, [
    'concurrency' => 50,
    'fulfilled'   => function(ResponseInterface $response) use ($client, &$requests) {
        $hash = bin2hex(random_bytes(10));
        $requests[] = $client->get(sprintf('http://httpbin.org/anything/%s', $hash), [
            'on_stats' => 'onStats',
        ]);
    },
    'rejected' => function($reason) {
        echo $reason . PHP_EOL;
    },
]))->promise();

// Wait for everything to finish
$p->wait(true);

Похоже, мой вопросбыть похожим на Инкрементно добавлять запросы в пул Guzzle 5.0 (Rolling Requests) , но отличается тем, что они относятся к различным основным версиям Guzzle.

1 Ответ

1 голос
/ 05 мая 2019

После публикации я смог больше искать и нашел еще несколько SO-тем и GitHub Issues для Guzzle.Я нашел эту библиотеку, которая, кажется, решает проблему.

https://github.com/alexeyshockov/guzzle-dynamic-pool

...