web-dev-qa-db-ja.com

しばらくの間XDebugでApacheをPHP)で実行した後、MacOSXで「開いているファイルが多すぎます」

BrewからのPHP 5.5.14の組み込みApache2Webサーバーを含むMacOS X 10.9.4を実行しています(パッケージ:php55、php55-intl、php55-pdo-pgsql、php55-xdebug) 。

このセットアップを実行すると、非常にうまく機能します。ただし、しばらくすると、リクエストごとに403エラーが発生します。 Apacheエラーログを調べたところ、次のようなものが見つかりました。

[Fri Jul 25 05:28:18 2014] [error] [client 127.0.0.1] PHP Warning:  require_once(/Users/daniel/Development/massiveart/sulu-complete/app/bootstrap.php.cache): failed to open stream: Too many open files in /Users/daniel/Development/massiveart/sulu-complete/web/website.php on line 10, referer: http://sulu.lo/de
[Fri Jul 25 05:28:18 2014] [error] [client 127.0.0.1] PHP Stack trace:, referer: http://sulu.lo/de
[Fri Jul 25 05:28:18 2014] [error] [client 127.0.0.1] PHP   1. {main}() /Users/daniel/Development/massiveart/sulu-complete/web/website.php:0, referer: http://sulu.lo/de
[Fri Jul 25 05:28:18 2014] [error] [client 127.0.0.1] PHP Fatal error:  require_once(): Failed opening required '/Users/daniel/Development/massiveart/sulu-complete/web/../app/bootstrap.php.cache' (include_path='.:/usr/local/Cellar/php55/5.5.14/lib/php') in /Users/daniel/Development/massiveart/sulu-complete/web/website.php on line 10, referer: http://sulu.lo/de
[Fri Jul 25 05:28:18 2014] [error] [client 127.0.0.1] PHP Stack trace:, referer: http://sulu.lo/de
[Fri Jul 25 05:28:18 2014] [error] [client 127.0.0.1] PHP   1. {main}() /Users/daniel/Development/massiveart/sulu-complete/web/website.php:0, referer: http://sulu.lo/de
[Fri Jul 25 05:28:40 2014] [crit] [client 127.0.0.1] (24)Too many open files: /Users/daniel/Development/massiveart/sulu-complete/web/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://sulu.lo/de
[Fri Jul 25 05:28:41 2014] [crit] [client 127.0.0.1] (24)Too many open files: /Users/daniel/Development/massiveart/sulu-complete/web/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://sulu.lo/de
[Fri Jul 25 05:28:41 2014] [crit] [client 127.0.0.1] (24)Too many open files: /Users/daniel/Development/massiveart/sulu-complete/web/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://sulu.lo/de
[Fri Jul 25 05:28:41 2014] [crit] [client 127.0.0.1] (24)Too many open files: /Users/daniel/Development/massiveart/sulu-complete/web/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://sulu.lo/de
[Fri Jul 25 05:28:45 2014] [crit] [client 127.0.0.1] (24)Too many open files: /Users/daniel/Development/massiveart/sulu-complete/web/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://sulu.lo/de
[Fri Jul 25 05:28:45 2014] [crit] [client 127.0.0.1] (24)Too many open files: /Users/daniel/Development/massiveart/sulu-complete/web/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable, referer: http://sulu.lo/de

ファイルを読み取ることができなくなったように見え、どういうわけか403を返します。特定の制限についてはすでに知っていますが、launchctlは開いているファイルに無制限のハード制限があると返します。

 ~ $ launchctl limit
    cpu         unlimited      unlimited
    filesize    unlimited      unlimited
    data        unlimited      unlimited
    stack       8388608        67104768
    core        0              unlimited
    rss         unlimited      unlimited
    memlock     unlimited      unlimited
    maxproc     709            1064
    maxfiles    256            unlimited

また、コマンドlaunchctl limit maxfiles 4096 16384を使用してmaxfilesを4096に設定しようとしましたが、しばらくしても問題は解決しません。他に何を確認できるか考えていますか?

[〜#〜] update [〜#〜]:Gordon Davissonの提案に従ってlsof -c httpdコマンドを実行すると、次のようなエントリが大量にあることがわかります。

httpd   1361 _www   15u    IPv4 0xb306b48659f63853       0t0     TCP localhost:50603->localhost:cslistener (CLOSED)

私が使用しているアプリケーションはWebSocketを使用しており、WebSocketが使用できない場合、または対応するものがサーバー上で実行されていない場合にもフォールバックを使用していると言えます。私を混乱させるのは(CLOSED)-partですが、なぜまだリストされているのですか?

[〜#〜] update [〜#〜]:しばらくして、cslistenerポート(実際には9000)を調べました。これも、xdebugがリモートデバッグをリッスンしているポートです。だから私はそこにいくつかの間違った設定があるか、それはxdebugのバグです(私はbrewによってインストールされたXDebug 2.2.5を使用しています)

13
Daniel Rotter

MacのXDEBUGでPHPStormを使用していますか?

私も同じ問題を抱えてる。 XDEBUGに提出された未解決のバグをここで見つけました:

http://bugs.xdebug.org/view.php?id=107

更新

このバグは修正されました:

Sean Duboisによるパッチをマージしました。これにより、この\ o /が修正されるはずです!パッチは2.3.4と2.4.0にあります。

これはコミットだと思います: https://github.com/xdebug/xdebug/commit/6efc6588efc277d648a78b69c11c721992c996f9

このパッチで更新されたバージョンを使用であることを確認してください。

14
Steve Tauber

Apacheで何かが実行されていると確信しています(おそらくPHPモジュールですが、確認するのは難しいです)。ファイル記述子がリークしています。つまり、ファイルを開いてから、開いたままにしておきます。この場合、開いているファイルの制限を増やすと、制限に達するまでの時間が長くなるだけです。本当に必要なのは、すべてのファイルを開いて開いたままにしているものを追跡することです。

lsof( "LiSt Open Files")コマンドで何が起こっているのか、おそらくいくつかのアイデアを得ることができます:

Sudo lsof -c httpd

Apacheが長時間実行されていないときに実行して、正常な状態を確認し、制限に達したときに再度実行します。 2番目の出力で、最初のリストにない追加のファイルがたくさんないか調べます。これは、all httpdプロセスによって開かれたファイルを一覧表示するため、多少複雑になることに注意してください。また、(Apacheの設定とサーバーの負荷によっては)多数のファイルが存在する場合があります。重要なのは、すべてのサーバープロセスの合計ではなく、単一のプロセスによって開かれたファイルの数です。 Sudo lsof -p someprocessIDを使用して、一度に1つのサーバープロセスのみを一覧表示することもできます。

うまくいけば、余分に開いているファイルが何であるかを確認することで、何がそれらを開いて開いたままにしているのかがわかります。

7
Gordon Davisson

Xdebug.iniに次の行を追加すると、問題も解決しました

xdebug.remote_autostart = 0
4
Femi Veys

私はOSX10.9.4とApache2.2とPHP 5.3 fromBrewの両方で同じことをしています。

これで実際に問題が解決するわけではありませんが、Apache MaxRequestsPerChild設定を10などに設定することで、問題を回避できます。これは、開発には問題ないはずです。

diff -r 2c0473b696fd -r acf809f04b17 Apache2/2.2/httpd.conf
--- a/Apache2/2.2/httpd.conf    Thu Aug 14 16:14:25 2014 -0500
+++ b/Apache2/2.2/httpd.conf    Thu Aug 14 16:19:10 2014 -0500
@@ -437,7 +437,7 @@
 # necessary.

 # Server-pool management (MPM specific)
-#Include /usr/local/etc/Apache2/2.2/extra/httpd-mpm.conf
+Include /usr/local/etc/Apache2/2.2/extra/httpd-mpm.conf

 # Multi-language error messages
 #Include /usr/local/etc/Apache2/2.2/extra/httpd-multilang-errordoc.conf
diff -r 2c0473b696fd -r acf809f04b17 Apache2/2.2/extra/httpd-mpm.conf
--- a/Apache2/2.2/extra/httpd-mpm.conf  Thu Aug 14 16:14:25 2014 -0500
+++ b/Apache2/2.2/extra/httpd-mpm.conf  Thu Aug 14 16:19:10 2014 -0500
@@ -38,7 +38,7 @@
     MinSpareServers       5
     MaxSpareServers      10
     MaxClients          150
-    MaxRequestsPerChild   0
+    MaxRequestsPerChild  10
 </IfModule>

 # worker MPM

これにより、少なくともこれらのリークされたファイルを取り除くためにApacheを頻繁に再起動する必要がなくなります。

1
barryp