Подтвердить что ты не робот

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

Я пытаюсь запустить тесты 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
4b9b3361

Ответ 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.