Неустранимая ошибка - слишком много открытых файлов
Я пытаюсь запустить тесты PHPUnit на моей новой машине, и я получаю эту ошибку:
PHP Неустранимая ошибка: исключить исключение "UnexpectedValueException" с сообщением "RecursiveDirectoryIterator:: __ construct (/usr/lib/php/pear/File/Iterator): не удалось открыть каталог: слишком много открытых файлов в/usr/lib/PHP/груша/Файл/Итератор/ 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
Ответы
Ответ 1
Это может быть ограничение на сервере, на котором выполняется код. Каждая операционная система допускает только определенное количество открытых файлов/дескрипторов/сокетов. Этот лимит обычно дополнительно уменьшается при виртуализации сервера. На сервере 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
Ответ 2
В php, перед выполнением, попробуйте это
exec('ulimit -S -n 2048');
Ответ 3
Не храните объекты DirectoryIterator позже; вы получите сообщение об ошибке "слишком много открытых файлов", когда вы храните больше, чем ограничение операционной системы (обычно 256 или 1024).
Например, это приведет к ошибке, если в каталоге слишком много файлов:
<?php
$files = array();
foreach (new DirectoryIterator('myDir') as $file) {
$files[] = $file;
}
?>
Предположительно, этот подход также интенсивно связан с памятью.
источник: http://php.net/manual/pt_BR/directoryiterator.construct.php#87425
Ответ 4
Как вы можете ограничить доступ к файлам (Linux или Max OS):
ulimit -n 10000
Решает проблему с phpunit
или/и phpdbg
и Warning: Uncaught ErrorException: require([..file]): failed to open stream: Too many open files in [...]
Ответ 5
После "пробуждения" моего компьютера из спящего режима я столкнулся с этой проблемой.
Перезапуск php-fpm, как и его исправление. Classic выключите и снова включите решение.
sudo/etc/init.d/php-fpm restart
Я думаю, это может быть связано с xdebug, который я недавно добавил в php.