2013-02-07 21 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) 古い:PHP 5.3.14

PHPUnitの出力毎回:

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

を試してみてください、あなたが 'fclose'を呼び出すために忘れていますか? – h2ooooooo

+0

fclose?申し訳ありませんが、あなたの評議会を理解していません – Mauro

答えて

37

これは、コードが実行されているサーバーでは制限があります。すべてのオペレーティングシステムでは、特定の数のオープンファイル/ハンドル/ソケットしか使用できません。この制限は、通常、サーバーが仮想化されている場合にさらに減少します。 Linuxサーバーでは、現在の制限をulimit -nで確認できます。ルートアクセス権を持っている場合は、同じコマンドで増やすことができます。私は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

@マウロ私はマーベリックス(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