Как исправить `не удалось открыть поток: ошибка слишком большого количества открытых файлов` в PHP - PullRequest
0 голосов
/ 24 октября 2018

У меня есть цикл, в котором я сохраняю некоторые изображения локально, а затем перемещаю их на S3

foreach ($images as $image) {
    // download image
    $stream = fopen($image['path'], 'wb');
    write($stream, $image['content']);
    fclose($stream);

    // copy to S3
    $manager->copy('local://' . $image['p'], 's3://' . $image['p']);
}

Проблема в том, что я получаю failed to open stream: Too many open files error ошибку

Любые идеи, как я могуизбежать этого?

Warning: include(/var/www/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php): failed to open stream: Too many open files in /var/www/vendor/composer/ClassLoader.php on line 444 Fatal error: Uncaught Error: Class 'Monolog\Formatter\LineFormatter' not found in /var/www/vendor/symfony/monolog-bridge/Handler/ConsoleHandler.php:155

1 Ответ

0 голосов
/ 24 октября 2018

Увеличьте ulimit -n или отключите многочастную загрузку в драйвере aws-s3 для flysystem.это flysystem, которая хранит слишком много открытых файлов.

Хорошо, быстрое решение для вас:

foreach ($images as $image) {

   $resourcesOpened = count(get_resources('stream'));

     while ( $resourcesOpened > 900 ) {
       sleep(10);
       $resourcesOpened = count(get_resources('stream'));
     }

     // download image
     $stream = fopen($image['path'], 'wb');
     write($stream, $image['content']);
     fclose($stream);

     // copy to S3
     $manager->copy('local://' . $image['p'], 's3://' . $image['p']);
   }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...