Intereting Posts

Неустранимая ошибка – слишком много открытых файлов

Я пытаюсь запустить тесты PHPUnit на моей новой машине, и я получаю эту ошибку:

PHP Неустранимая ошибка: исключить исключение «UnexpectedValueException» с сообщением «RecursiveDirectoryIterator :: __ construct (/ usr / lib / php / pear / File / Iterator): не удалось открыть каталог: слишком много открытых файлов в / usr / lib / php / pear /File/Iterator/Factory.php:114

Тот же код на старой машине работает хорошо …

Новая машинная среда: PHP Версия: PHP 5.3.21 (cli) Старее: PHP 5.3.14

Выход PHPUnit каждый раз:

................EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE 65 / 66 ( 98%) E Time: 34 seconds, Memory: 438.50Mb There were 50 errors: 1) XXXXXXXXXXX PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/usr/lib/php/pear/File/Iterator): failed to open dir: Too many open files' in /usr/lib/php/pear/File/Iterator/Factory.php:114 

Это может быть ограничение на сервере, на котором выполняется код. Каждая операционная система допускает только определенное количество открытых файлов / дескрипторов / сокетов. Этот лимит обычно дополнительно уменьшается при виртуализации сервера. На сервере Linux вы можете проверить текущий предел с помощью ulimit -n , если у вас есть root-доступ, вы можете увеличить его с помощью той же команды. Я предполагаю, что есть метод для сервера Windows. В противном случае вы не можете с этим справиться (за исключением того, что попросите вашего хостера или администратора увеличить его).

Более настраиваемые ограничения:

 In /etc/security/limits.conf soft nofile 1024 hard nofile 65535 Increase ulimit by "ulimit -n 65535" echo 65535 > /proc/sys/fs/file-max In /etc/sysctl.conf fs.file-max=65535 

В php, перед выполнением, попробуйте это

 exec('ulimit -S -n 2048'); 

Не храните объекты DirectoryIterator позже; вы получите сообщение об ошибке «слишком много открытых файлов», когда вы храните больше, чем ограничение операционной системы (обычно 256 или 1024).

Например, это приведет к ошибке, если в каталоге слишком много файлов:

 <?php $files = array(); foreach (new DirectoryIterator('myDir') as $file) { $files[] = $file; } ?> 

Предположительно, этот подход также интенсивно связан с памятью.

источник: http://php.net/manual/pt_BR/directoryiterator.construct.php#87425