请求"完成"文件未关闭使用guzzle 5.3


File not closed on Request "Complete" using guzzle 5.3

我们正在使用guzzle pool上传1500多个文件。由于我们不想碰到"打开的文件太多",我们认为可以使用事件"before"执行fopen,使用"complete"执行fclose流。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 ...

数字永远不会下降

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

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

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

完整事件