Файл не закрыт по запросу «Завершить» с использованием жерла 5.3

Мы загружаем более 1500 файлов, используя пул жужжа. Поскольку мы не хотим запускать «слишком много открытых файлов», мы решили, что мы можем использовать событие «раньше», чтобы сделать fopen и «complete», чтобы 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 ...

Число никогда не падает.

Related of "Файл не закрыт по запросу «Завершить» с использованием жерла 5.3"

Вам нужно закрыть поток запроса вместо ответа. Кажется, что поток ответов закрыт автоматически. Так что просто замените

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

от

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

в вашем полном мероприятии