36

新しいマシンでPHPUnitテストを実行しようとすると、次のエラーが発生します。

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

10 に答える 10

50

これは、コードが実行されているサーバーの制限になる可能性があります。すべてのオペレーティングシステムは、特定の数の開いているファイル/ハンドル/ソケットのみを許可します。サーバーが仮想化されると、通常、この制限はさらに軽減されます。Linuxサーバーでは、で現在の制限を確認できulimit -nます。rootアクセス権がある場合は、同じコマンドで制限を増やすことができます。Windowsサーバーにも方法があると思います。そうでなければ、あなたがそれについてできることはあまりありません(あなたのホスティング業者または管理者にそれを増やすように頼むことを除いて)。

より構成可能な制限:

での変更/etc/security/limits.conf

soft nofile 1024
hard nofile 65535

ulimit -n 65535 またはecho 65535 > /proc/sys/fs/file-max でulimitを増やし/etc/sysctl.confます:

fs.file-max=65535
于 2013-02-07T10:39:32.630 に答える
31

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

ulimit -n 10000

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

于 2018-06-02T20:22:31.513 に答える
5

PHPでは、実行する前に、これを試してください

exec('ulimit -S -n 2048');
于 2016-12-13T13:29:36.843 に答える
2

コンピュータをスリープモードから「ウェイクアップ」した後、この問題が発生しました。

そのようにphp-fpmを再起動すると修正されました。クラシックはそれをオフにしてから再びオンにします。

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

これは、最近phpに追加したxdebugに関連している可能性があると思います。

于 2018-12-03T16:42:02.040 に答える
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

于 2016-06-10T17:55:20.427 に答える
1

サーバーdebianでは、

/etc/php/php7.xx/fpm/pool.d/www.conf

rlimit_files = 10000

/etc/init.d/php7.xx restart
于 2019-09-16T08:28:14.420 に答える
1

クロージャで何かをラップするのを忘れたときに、これがPHPで発生することに気づきました。最近のdiffを注意深く見てください。そうすれば、これの根底にたどり着くことができるかもしれません(私の場合、私$fakerはクロージャーなしでLaravelPHPユニットファクトリーで参照しました。

于 2020-05-06T14:09:22.543 に答える
0

たぶん、ファイルにエラーがあります/etc/init.d/phpx.x-fpm。再起動しましょう:

sudo /etc/init.d/php7.2-fpm restart
于 2019-11-10T15:38:02.710 に答える
0

PHPがロードしようとするRedisライブラリについて毎回このエラーが発生しましたが、最初は思いもよらなかったことが原因でした。プログラムがしばらく実行されているときにこのエラーが発生し続け、繰り返しプロセスを実行していました。$ch = new curl_init(...)クラスのデストラクタで閉じられたcURLセッション()を開いたことがわかりましたが、そのデストラクタは呼び出されませんでした。その問題を修正すると、ファイルが多すぎるというエラーが消えました。

于 2021-01-31T02:03:29.483 に答える
0

プールに追加したURLが多すぎる(約2000のURL)Httpプールに関連してこのエラーが発生します。

URLを小さなバッチにチャンクする必要があり、エラーは停止しました。

ガズルプールがどのように機能するかと思います。プール全体が完了する前にカール接続を閉じません。

元。

$responses = Http::pool(function (Pool $pool) use ($chunk) {
    return collect($chunk)->map(fn($url) => $pool->get($url));
});

になる:

collect($urls)
    ->chunk(25)
    ->each(function ($chunk) {
        $responses = Http::pool(function (Pool $pool) use ($chunk) {
            return collect($chunk)->map(fn($url) => $pool->get($url));
        });
    });

Http関数は、GuzzleHttpクライアントを使用するLaravelのラッパー関数です。https://laravel.com/docs/9.x/http-client

于 2022-02-20T11:12:19.687 に答える