2013-02-07 21 views
18

Ich versuche PHPUnit Tests in meiner neuen Maschine laufen zu lassen, und ich bekomme diese Fehlermeldung:Fatal Error - Zu viele offene Dateien

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

Der gleiche Code auf der alten Maschine gut laufen ...

New Maschinenumgebung: PHP Version: PHP 5.3.21 (cli) Older: PHP 5.3.14

PHPUnit Ausgang jedes Mal: ​​

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

vergessen, Sie 'fclose' anrufen? – h2ooooooo

+0

schließen? Entschuldigung, aber ich verstehe Ihren Rat nicht – Mauro

Antwort

37

Dies kann eine Einschränkung für den Server sein, auf dem der Code ausgeführt wird. Jedes Betriebssystem erlaubt nur eine bestimmte Anzahl von offenen Dateien/Handles/Sockets. Dieses Limit wird normalerweise weiter reduziert, wenn der Server virtualisiert wird. Auf einem Linux-Server können Sie das aktuelle Limit mit ulimit -n überprüfen, wenn Sie Root-Zugriff haben, können Sie es mit demselben Befehl erhöhen. Ich nehme an, dass es auch eine Methode für Windows-Server gibt. Ansonsten können Sie nicht viel tun (außer bitten Sie Ihren Hoster oder Administrator, es zu erhöhen).

Weitere konfigurierbare Einschränkungen:

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

$ ulimit -n> 256. Ich bin auf OSX – Mauro

+2

256 ist nicht viel –

+1

@Mauro Ich bekomme 4864 auf Mavericks (OSX 10.9) – JamesHalsall

1

Bewahren Sie keine DirectoryIterator Objekte für später; Wenn Sie mehr als das Betriebssystemlimit (normalerweise 256 oder 1024) speichern, erhalten Sie eine Fehlermeldung mit dem Hinweis "zu viele geöffnete Dateien".

Zum Beispiel wird dies auf einen Fehler ergibt, wenn das Verzeichnis zu viele Dateien hat:

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

Vermutlich ist dieser Ansatz als auch speicherintensiv ist.

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

2

in PHP geschrieben, vor der Ausführung, versuchen Sie diese

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

This funktioniert nicht für mich. Versucht, diese Zeile sowohl in 'setUp()' und 'setUpBeforeClass()' Methoden hinzuzufügen. Das manuelle Ausführen auf dem Terminal vor dem Start von Komponententests funktioniert jedoch. – Koen

Verwandte Themen