アップデート

アップデート

私は Mac OS X 10.9.4 を実行しており、これには brew の PHP 5.5.14 を搭載した組み込みの apache2 Web サーバーが含まれています (パッケージ: 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

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

アップデート: lsof -c httpdGordon Davisson の提案に従ってコマンドを実行すると、次のようなエントリが多数あることがわかります。

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

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

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

答え1

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

私も同じ問題を抱えています。XDEBUG で未解決のバグを見つけました:

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

アップデート

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

Sean Dubois によるパッチをマージしたところ、この問題が解決されるはずです \o/! パッチは 2.3.4 と 2.4.0 に含まれます。

これはコミットだと思います:コミット:

必ず更新バージョンを使用するこのパッチで。

答え2

Apache で何か実行されていて、それがファイル記述子を漏らしている (おそらく PHP モジュールですが、確信は持てません) ことはほぼ確実です。つまり、ファイルを開いてから、いつまでも開いたままにしているということです。この場合、開いているファイルの制限を増やすと、制限に達するまでの時間が長くなります。本当に必要なのは、すべてのファイルを開いて開いたままにしている原因を突き止めることです。

lsofおそらく、 ("LiSt Open Files") コマンドで何が起こっているのかがわかるでしょう:

sudo lsof -c httpd

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

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

答え3

xdebug.iniに次の行を追加することでも問題は解決しました

xdebug.remote_autostart = 0

答え4

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を定期的に再起動する必要がなくなります。

関連情報