web-dev-qa-db-fra.com

Erreur fatale - Trop de fichiers ouverts

J'essaie d'exécuter PHPUnit Tests sur ma nouvelle machine et j'obtiens cette erreur:

Erreur irrécupérable PHP: exception non capturée 'UnexpectedValueException' avec le message 'RecursiveDirectoryIterator :: __ construct (/ usr/lib/php/pear/File/Iterator): impossible d'ouvrir le répertoire: trop de fichiers ouverts' dans/usr/lib/php/pear /File/Iterator/Factory.php:114

Le même code sur l'ancienne machine a bien fonctionné ...

Nouvel environnement de machine: Version PHP: PHP 5.3.21 (cli) Plus ancien: PHP 5.3.14

PHPUnit affiche chaque fois:

................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
23
Mauro

Cela peut être une limitation sur le serveur sur lequel le code est en cours d'exécution. Chaque système d'exploitation n'autorise qu'un certain nombre de fichiers/handles/sockets ouverts. Cette limite est généralement encore réduite lorsque le serveur est virtualisé. Sur un serveur Linux, vous pouvez vérifier la limite actuelle avec ulimit -n. Si vous avez un accès root, vous pouvez l'augmenter avec la même commande. Je suppose qu'il existe également une méthode pour le serveur Windows. Sinon, vous ne pouvez rien faire à ce sujet (sauf demander à votre hébergeur ou à votre administrateur de l'augmenter).

Plus de limitations configurables:

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 
41
Gerald Schneider

En php, avant l'exécution, essayez ceci

exec('ulimit -S -n 2048');
2
Rômulo Z. C. Cunha

Comment pouvez-vous augmenter la limite d'ouverture de fichiers (Linux ou Max OS):

ulimit -n 10000

Résout le problème avec phpunit ou/et phpdbg et Warning: Uncaught ErrorException: require([..file]): failed to open stream: Too many open files in [...]

2
pablorsk

Ne stockez pas les objets DirectoryIterator pour plus tard; vous obtiendrez une erreur indiquant «trop de fichiers ouverts» lorsque vous enregistrez plus que la limite du système d'exploitation (généralement 256 ou 1024). 

Par exemple, cela produira une erreur si le répertoire contient trop de fichiers:

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

Vraisemblablement, cette approche nécessite également beaucoup de mémoire.

source: http://php.net/manual/pt_BR/directoryiterator.construct.php#87425

1
user1666651

Après avoir «réveillé» mon ordinateur du mode veille, j'ai rencontré ce problème.

Redémarrer php-fpm comme ça le corrige. Classic éteignez et rallumez la solution.

Sudo /etc/init.d/php-fpm restart

Je pense que cela peut être lié à xdebug que j'ai récemment ajouté à php.

0
Lando