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

时间:2015-09-01 03:38:25

标签: php guzzle

我们正在使用guzzle池上传1500多个文件。因为我们不想碰到太多打开的文件"我们认为我们可以使用事件"之前"做fopen和"完成" 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 ...

这个数字永远不会下降。

1 个答案:

答案 0 :(得分:2)

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

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

通过

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

在你的完整活动中