我们正在使用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
...
这个数字永远不会下降。
答案 0 :(得分:2)
您需要关闭请求的流而不是响应流。响应流似乎自动关闭。所以只需替换
$stream = $e->getResponse()->getBody();
通过
$stream = $e->getRequest()->getBody();
在你的完整活动中