我们正在使用口吻池上传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 ...
这个数字永远不会下降。
发布于 2015-09-01 12:47:48
您需要关闭请求的流而不是响应流。响应流似乎是自动关闭的。所以就换个
$stream = $e->getResponse()->getBody();
通过
$stream = $e->getRequest()->getBody();
在你的全部事件中
https://stackoverflow.com/questions/32323140
复制相似问题