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