XDebugを使用してPHPでapacheをしばらく実行した後、Mac OSXで「開いているファイルが多すぎます」


13

私はMac OS X 10.9.4を実行しています。これには、brewのPHP 5.5.14(パッケージ:php55、php55-intl、php55-pdo-pgsql、php55-xdebug)が組み込まれたapache2 Webサーバーが組み込まれています。

このセットアップを実行すると、非常にうまく機能します。ただし、しばらくすると、すべてのリクエストに対して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

また、コマンドを使用してmaxfilesを4096に設定しようとしましたが、しばらくするとlaunchctl limit maxfiles 4096 16384問題が再発します。他に何を確認できますか?

更新lsof -c httpdGordon Davissonによって提案されたコマンドを実行すると、次のようなエントリが大量にあることがわかります。

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

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

更新:しばらくして、実際には9000であるcslistenerポートを調べました。これは、xdebugがリモートデバッグをリッスンしているポートです。だから私はそこにいくつか間違った構成を持っているか、それはxdebugのバグだと思います(私はbrewによってインストールされたXDebug 2.2.5を使用しています)

回答:


14

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

私は同じ問題を抱えています。XDEBUGでファイルされた未解決のバグをここで見つけました。

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

更新

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

Sean Duboisによるパッチをマージしたところ、この\ o /を修正できるはずです!パッチは2.3.4および2.4.0になります。

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

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


実際には解決策ではありませんが、それは質問に答えると思います
ダニエルロッター14年

基本的に、Xdebugは、デバッグクライアントが開いていないときに、接続リスナーのファイル記述子をリークしています(これが技術的に正しくない場合は、それがアイデアです)。この問題を解決するには、リモートデバッガーがデバッグセッションを開始するときにデバッガークライアントが開いていることを確認します。もちろん、より良い解決策は、開発者によるバグの修正です。
mcdado

これは、いくつかのデバッガーが開いている場合にも発生します(PhpStormなど)。うまくいけば、彼らはそれを修正します:)
スティーブタウバー14年

これは非常に大きな問題であり、修正が間もなく発行されることを願っています。
ヒューバートペ

1
別の回避策は、設定することですxdebug.remote_enable=0php.iniそれらを使用しないときはxdebugのリモート接続を有効にします。Apacheの再起動が必要です。
グレゴリーコスモハウン

7

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

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

sudo lsof -c httpd

apacheが長時間実行されていないときに実行して正常な状態を確認し、次に制限に達したときに再度実行します。2番目の出力で、最初のリストにはない多くの追加ファイルを探します。これは、すべての httpdプロセスによって開かれたファイルを一覧表示するという事実によってやや複雑になることに注意してください。重要なことは、すべてのサーバープロセスの合計ではなく、1つのプロセスで開かれたファイルの数です。またsudo lsof -p someprocessID、一度に1つのサーバープロセスのみをリストすることもできます。

開いている余分なファイルが何であるかを見れば、何を開いて開いたままにしておくのかがわかります。


それを試して、質問を更新しました。
ダニエルロッター14

TCPソケットの状態の正確な意味についてはあまり詳しくありませんが、相手への接続が適切に閉じられていないようです。それはcslistenerポート(番号9000)で実行されていますか?アプリは、対応するアプリとの接続をどのくらい正確に閉じますか?TCPセッションは閉じていますが、ファイル記述子は閉じていませんか?
ゴードンデイヴィソン14

1
xdebugがリッスンしているポートは9000であることがわかったので、この拡張機能にエラーがある可能性はありますか?
ダニエルロッター14


1

OSX 10.9.4とBrewのApache 2.2とPHP 5.3の両方で同じことを実現しています。

これで実際に問題が解決するわけではありませんが、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を頻繁に再起動する必要がなくなります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.