【问题标题】:How to handle exception in Guzzle Async request?如何处理 Guzzle 异步请求中的异常?
【发布时间】:2019-10-19 19:30:31
【问题描述】:

当我尝试使用 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];

如果文件图像正常 - 一切都按预期工作,但如果其中一个失败 - 我有下一个错误

在文件 /var/www/my.site/localhost/core/libraries/guzzlehttp/psr7/src/Stream.php 的第 250 行中引发 RuntimeException 类型的目录导入异常。无法写入流。

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

如果有人知道,请帮忙。

【问题讨论】:

    标签: php asynchronous guzzle


    【解决方案1】:

    我通过打开流解决了这个问题:

    $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];
    

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 2022-11-28
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2017-07-09
      • 2018-02-11
      • 1970-01-01
      • 2016-06-09
      相关资源
      最近更新 更多