web-dev-qa-db-ja.com

致命的エラー-開いているファイルが多すぎます

新しいマシンでPHPUnit Testsを実行しようとすると、次のエラーが表示されます。

PHP致命的エラー:メッセージ 'RecursiveDirectoryIterator :: __ construct(/ usr/lib/php/pear/File/Iterator)でキャッチされない例外' UnexpectedValueException ':/ usr/lib/php/pearのdir:Too many open filesを開けませんでした/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
23
Mauro

これは、コードが実行されているサーバーの制限になる場合があります。すべてのオペレーティングシステムでは、特定の数の開いているファイル/ハンドル/ソケットのみが許可されます。この制限は通常、サーバーが仮想化されるとさらに削減されます。 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 
43

Phpで、実行前にこれを試してください

exec('ulimit -S -n 2048');
3

ファイルのオープン制限をどのように上げることができますか(LinuxまたはMax OS):

_ulimit -n 10000
_

phpunitまたは/およびphpdbgおよびWarning: Uncaught ErrorException: require([..file]): failed to open stream: Too many open files in [...]の問題を解決します

3
pablorsk

後で使用するためにDirectoryIteratorオブジェクトを保存しないでください。オペレーティングシステムの制限(通常256または1024)を超えて保存すると、「開いているファイルが多すぎます」というエラーが表示されます。

たとえば、ディレクトリのファイルが多すぎる場合、エラーが発生します。

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

おそらく、このアプローチもメモリ集約型です。

ソース: http://php.net/manual/pt_BR/directoryiterator.construct.php#87425

1
user1666651

コンピューターをスリープモードから「ウェイク」した後、この問題に遭遇しました。

Php-fpmを再起動すると修正されました。クラシックは、ソリューションをオフにして再びオンにします。

Sudo /etc/init.d/php-fpm restart

これは、最近phpに追加したxdebugに関連していると思われます。

1
Lando