2013-02-07 40 views
18

我嘗試在我的新機中運行PHPUnit測試,我得到這個錯誤:致命錯誤 - 打開的文件太多

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

舊機器上的相同的代碼運行良好......

新機器環境: PHP版本:PHP 5.3.21(CLI) 老年人:

................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 
:每次PHP 5.3.14

PHPUnit的輸出

+1

你是不是忘記叫'fclose'? – h2ooooooo

+0

fclose?對不起,但我不明白你的議會 – Mauro

回答

37

這可能是運行代碼的服務器上的限制。每個操作系統只允許一定數量的打開文件/句柄/套接字。當服務器虛擬化時,這個限制通常會進一步縮小。在Linux服務器上,您可以使用ulimit -n檢查當前的限制,如果您具有root用戶訪問權限,則可以使用相同的命令來增加它。我認爲還有一種Windows服務器的方法。否則,你可以做的事情不多(除非要求你的主機或管理員增加它)。

更多配置的侷限性:

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.我在OSX – Mauro

+2

256是不是很多 –

+1

@Mauro我在小牛(OSX 10.9)上得到4864 – JamesHalsall

1

不要存放DirectoryIterator對象供以後;當存儲的操作系統限制超過操作系統限制(通常爲256或1024)時,您將收到一個錯誤,指出「打開的文件過多」。

例如,如果目錄中有太多的文件,這將產生一個錯誤:

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

據推測,這種做法是內存密集型的爲好。

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

2

在PHP中執行之前,試試這個

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

這不適合我。試圖在'setUp()'和'setUpBeforeClass()'方法中添加這一行。然而,在啓動單元測試之前,在終端上手動執行它。 – Koen

相關問題