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
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
En php, avant l'exécution, essayez ceci
exec('ulimit -S -n 2048');
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 [...]
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
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.