首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >文件未按要求关闭,请“完成”使用guese5.3

文件未按要求关闭,请“完成”使用guese5.3
EN

Stack Overflow用户
提问于 2015-09-01 03:38:25
回答 1查看 1.2K关注 0票数 1

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

下面是代码:

代码语言:javascript
运行
复制
    $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 ...

这个数字永远不会下降。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-01 12:47:48

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

代码语言:javascript
运行
复制
$stream = $e->getResponse()->getBody();

通过

代码语言:javascript
运行
复制
$stream = $e->getRequest()->getBody();

在你的全部事件中

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32323140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档