2013-02-07 2 views
18

provo a eseguire i test PHPUnit nella mia nuova macchina ed ottengo questo errore:Fatal Error - Troppi file aperti

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

Lo stesso codice sulla vecchia macchina gestito bene ...

Nuovo ambiente della macchina: Versione PHP: PHP 5.3.21 (CLI) Older: PHP 5.3.14

uscita PHPUnit ogni volta:

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

stai dimenticando di chiamare 'fclose'? – h2ooooooo

+0

fclose? scusa ma non capisco il tuo consiglio – Mauro

risposta

37

Questa può essere una limitazione sul server in cui è in esecuzione il codice. Ogni sistema operativo consente solo un certo numero di file aperti/handle/socket. Questo limite viene solitamente ulteriormente ridotto quando il server è virtualizzato. Su un server Linux è possibile controllare il limite corrente con ulimit -n, se si dispone dell'accesso di root è possibile aumentarlo con lo stesso comando. Presumo che ci sia un metodo per il server Windows. Altrimenti non c'è molto che puoi fare a riguardo (eccetto chiedere al tuo hoster o all'amministratore di aumentarlo).

limitazioni Maggiori configurabili:

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. Sono su OSX – Mauro

+2

256 non è molto –

+1

@Mauro ottengo 4864 su Mavericks (OSX 10.9) – JamesHalsall

1

Non conservare oggetti DirectoryIterator per dopo; si riceverà un errore che dice "troppi file aperti" quando si memorizza più del limite del sistema operativo (in genere 256 o 1024).

Per esempio, questo produrrà un errore se la directory ha troppi file:

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

Presumibilmente, questo approccio è intensivo di memoria pure.

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

2

in php, prima dell'esecuzione, provate questo

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

Questo non funziona per me Ho cercato di aggiungere questa riga in entrambi i metodi 'setUp()' e 'setUpBeforeClass()'. Eseguirlo manualmente sul terminale prima di lanciare i test di unità funziona comunque. – Koen