【问题标题】:File not closed on Request "Complete" using guzzle 5.3使用 guzzle 5.3 请求“完成”时未关闭文件
【发布时间】:2015-11-26 04:33:42
【问题描述】:

我们正在使用 guzzle 池上传 1500 多个文件。由于我们不想遇到“打开的文件太多”,我们认为我们可以使用事件“之前”来执行 fopen 和“完成”来关闭流。 PHP 没有有效地关闭资源(我们打开了太多打开的文件)。知道发生了什么/我们可以做些什么来解决这个问题?

代码如下:

    $client = new GuzzleHttp\Client();
    $requests = [];
    foreach($files as $fileName) {
        $options = [
            'debug' => false,
            'events' => [
                'before'=>
                    function (BeforeEvent $e) use ($fileName) {
                        echo 'Opening body|'.count(glob('/proc/'.posix_getpid().'/fd/*')).PHP_EOL;
                        $stream = \GuzzleHttp\Stream\Stream::factory(fopen($fileName,'r'));
                        $e->getRequest()->setBody($stream);
                    },
                'complete' =>
                    function (CompleteEvent $e){
                        echo 'Closing body|'.count(glob('/proc/'.posix_getpid().'/fd/*')).PHP_EOL;
                        $stream = $e->getResponse()->getBody();
                        $stream->close();
                    },
            ]
        ];

        $request = $client->createRequest('POST', $this->baseUri . $this->uploadPath, $options);
        $requests[] = $request;
    }
    Pool::batch($client, $requests, ['pool_size'=> $this->poolSize]);

输出: Opening body|31 Closing body|57 Opening body|57 Opening body|58 Closing body|59 Opening body|59 Closing body|61 Opening body|61 Closing body|62 Opening body|62 Closing body|63 ...

这个数字永远不会下降。

【问题讨论】:

    标签: php guzzle


    【解决方案1】:

    您需要关闭请求流而不是响应流。响应流似乎已自动关闭。所以只需替换

    $stream = $e->getResponse()->getBody();
    

    $stream = $e->getRequest()->getBody();
    

    在您的完整活动中

    【讨论】:

    • 哦,这太合乎逻辑了!我的坏:)
    猜你喜欢
    • 2015-11-26
    • 2019-05-27
    • 2022-12-06
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多