Как обработать исключение в запросе Guzzle Async? - PullRequest
1 голос
/ 04 июня 2019

У меня проблема при попытке загрузить много изображений с помощью Guzzle. Некоторые из них, вероятно, недействительны, поэтому, когда я сделал AsyncRequest, я не смог обработать исключение для каждого изображения.

Я пытался создать метод проверки, который должен работать с загруженными файлами, но он не работает вовремя.


$requests = function () use ($client, $imagesMetaData) {
            foreach ($imagesMetaData as $index => $image) {
                yield $index => function () use ($client, $image) {
                    try {
                        $resource = fopen($image['savePath'], 'w+b');
                        if (!$resource) {
                            // do smth
                        }

                        $opts = ['sink' => $resource];
                        $result = $client->requestAsync('GET', $image['downloadUri'], $opts);

                        return ($result);

                    } catch (\Exception $e) {
                        $image['writeLog'](
                            // do smth
                        );

                        return new Response(404);
                    }
                };
            }
        };

Pool::batch($client, $requests(), [
                'concurrency' => 5,
                'fulfilled'   => function (Response $response, $index) use ($me, $imagesMetaData, &$fulfilled, &$rejected) {
                    $image = $imagesMetaData[$index];

                    foreach ($imagesMetaData as $image) {
                        if ($me->validateDownloadedImage($image)) {
                            $fulfilled[] = $image;
                        } else {
                            $rejected[] = $image;
                        }
                    }
                },
                'rejected'    => function ($reason, $index) use ($me, $imagesMetaData, &$rejected) {

                    $image = $imagesMetaData[$index];

                    $me->rejectImage($image, $reason);
                    $rejected[] = $image;
                }
            ]);

            return [$fulfilled, $rejected];

Если с файлами изображений все в порядке - все работает как положено, но если один из них не удался - у меня следующая ошибка

Исключение импорта каталога типа RuntimeException, выброшенное в файл /var/www/my.site/localhost/core/libraries/guzzlehttp/psr7/src/Stream.php в строке 250. Невозможно записать в поток.

https://i.imgur.com/SBLpni5.png

Если кто-то знает это, пожалуйста, помогите.

1 Ответ

0 голосов
/ 04 июня 2019

Я исправил это с помощью открытия потока:

$stream   = stream_for($resource);

и передайте этот поток в «сток» :

'sink' => $stream

итоговый код выглядит так:

$requests = function () use ($client, $imagesMetaData) {
            foreach ($imagesMetaData as $index => $image) {
                yield $index => function () use ($client, $image) {
                    try {
                        $resource = fopen($image['savePath'], 'w+b');
                        $stream   = stream_for($resource);

                        if (!$resource) {
                            // do smth
                        }

                        $opts = ['sink' => $stream];
                        $result = $client->requestAsync('GET', $image['downloadUri'], $opts);

                        return ($result);

                    } catch (\Exception $e) {
                        $image['writeLog'](
                            // do smth
                        );

                        return new Response(404);
                    }
                };
            }
        };

Pool::batch($client, $requests(), [
                'concurrency' => 5,
                'fulfilled'   => function (Response $response, $index) use ($me, $imagesMetaData, &$fulfilled, &$rejected) {
                    $image = $imagesMetaData[$index];

                    foreach ($imagesMetaData as $image) {
                        if ($me->validateDownloadedImage($image)) {
                            $fulfilled[] = $image;
                        } else {
                            $rejected[] = $image;
                        }
                    }
                },
                'rejected'    => function ($reason, $index) use ($me, $imagesMetaData, &$rejected) {

                    $image = $imagesMetaData[$index];

                    $me->rejectImage($image, $reason);
                    $rejected[] = $image;
                }
            ]);

            return [$fulfilled, $rejected];
...