我们正在使用guzzle pool上传1500多个文件。由于我们不想碰到"打开的文件太多",我们认为可以使用事件"before"执行fopen,使用"complete"执行fclose流。PHP没有有效地关闭资源(我们碰到了太多打开的文件)。知道发生了什么/我们能做些什么来解决这个问题吗?
代码如下:
$client = new GuzzleHttpClient();
$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 = GuzzleHttpStreamStream::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();
完整事件