使用 guzzle 5.3 未根据请求 "Complete" 关闭文件

File not closed on Request "Complete" using guzzle 5.3

我们正在使用 guzzle 池上传 1500 多个文件。由于我们不想 运行 进入 "too many open files" 我们认为我们可以使用事件 "before" 来执行 fopen 和 "complete" 来关闭流。 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();

在你的完整事件中