Мы загружаем более 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 ...
Число никогда не падает.
Вам нужно закрыть поток запроса вместо ответа. Кажется, что поток ответов закрыт автоматически. Так что просто замените
$stream = $e->getResponse()->getBody();
от
$stream = $e->getRequest()->getBody();
в вашем полном мероприятии