新しいマシンで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
これは、コードが実行されているサーバーの制限になる場合があります。すべてのオペレーティングシステムでは、特定の数の開いているファイル/ハンドル/ソケットのみが許可されます。この制限は通常、サーバーが仮想化されるとさらに削減されます。 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
Phpで、実行前にこれを試してください
exec('ulimit -S -n 2048');
ファイルのオープン制限をどのように上げることができますか(LinuxまたはMax OS):
_ulimit -n 10000
_
phpunit
または/およびphpdbg
およびWarning: Uncaught ErrorException: require([..file]): failed to open stream: Too many open files in [...]
の問題を解決します
後で使用するためにDirectoryIteratorオブジェクトを保存しないでください。オペレーティングシステムの制限(通常256または1024)を超えて保存すると、「開いているファイルが多すぎます」というエラーが表示されます。
たとえば、ディレクトリのファイルが多すぎる場合、エラーが発生します。
<?php
$files = array();
foreach (new DirectoryIterator('myDir') as $file) {
$files[] = $file;
}
?>
おそらく、このアプローチもメモリ集約型です。
ソース: http://php.net/manual/pt_BR/directoryiterator.construct.php#87425
コンピューターをスリープモードから「ウェイク」した後、この問題に遭遇しました。
Php-fpmを再起動すると修正されました。クラシックは、ソリューションをオフにして再びオンにします。
Sudo /etc/init.d/php-fpm restart
これは、最近phpに追加したxdebugに関連していると思われます。