2013-02-07 13 views
18

próbuję uruchomić testy phpunit w moim nowym komputerze i uzyskać ten błąd:Fatal Error - Zbyt wiele otwartych plików

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

Ten sam kod na starym komputerze działa dobrze ...

New środowisko maszyny: Wersja PHP: PHP 3.5.21 (CLI) Starsze: PHP 5.3.14

wyjście PHPUnit za każdym razem:

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

zapomniałeś zadzwonić 'fclose'? – h2ooooooo

+0

fclose? przepraszam, ale nie rozumiem twojej rady – Mauro

Odpowiedz

37

Może to być ograniczenie na serwerze, na którym działa kod. Każdy system operacyjny dopuszcza tylko określoną liczbę otwartych plików/uchwytów/gniazd. Ograniczenie to jest zwykle dalej zmniejszane, gdy serwer jest zwirtualizowany. Na serwerze z systemem Linux można sprawdzić bieżący limit za pomocą ulimit -n, jeśli masz uprawnienia administratora, możesz go zwiększyć przy użyciu tego samego polecenia. Zakładam, że istnieje również metoda dla serwera Windows. W przeciwnym razie niewiele można z tym zrobić (z wyjątkiem poproszenia swojego gospodarza lub administratora o jego zwiększenie).

bardziej konfigurowalny ograniczenia:

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. Jestem na OSX – Mauro

+2

256 nie jest dużo –

+1

@Mauro Dostaję 4864 na Mavericks (OSX 10.9) – JamesHalsall

1

Nie przechowywać przedmiotów DirectoryIterator na później; pojawi się komunikat "zbyt wiele otwartych plików", gdy przechowujesz więcej niż limit systemu operacyjnego (zwykle 256 lub 1024).

Na przykład ten przyniesie błąd, jeśli katalog ma zbyt wiele plików:

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

Można przypuszczać, że takie podejście jest intensywnie wykorzystujących pamięć, jak również.

źródło: http://php.net/manual/pt_BR/directoryiterator.construct.php#87425

2

w PHP, przed egzekucją, spróbuj tego

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

nie działa dla mnie. Próbowałem dodać tę linię zarówno w metodach 'setUp()' jak i 'setUpBeforeClass()'. Jednak wykonanie go ręcznie na terminalu przed uruchomieniem testów jednostkowych działa. – Koen

Powiązane problemy