nginx で php-cgi がなぜか停止するという話
Windows + nginx + php-cgi という不思議な環境を使っています。 php-cgiはFastCGIで動かしています。
このところ不意に php-cgi が落ちるという現象で悩んでました。 結論から言うと、これは正常な動作で、phpの不具合ではないです。
パフォーマンス測定を実施するとたしか500回のリクエストで落ちました。以下利用したコマンド:
$ httperf --server localhost --port 80 --uri /jobs/ --rate 10 --num-conn 1000 --num-call 1 --timeout 5
なんで落ちるん。この500回ってなんやねん、ということで調べてみるとありました。
http://www.webhostingtalk.com/showthread.php?t=944042
PHP_FCGI_MAX_REQUESTS の数値回数でphp-cgiがそのリクエスト数を受け取ると落ちる正常に終了するということが分かりました。
ということで、ひとまず PHP_FCGI_MAX_REQUESTS=0 を指定してphp-cgiを起動すれば回数の制限で終了することがなくなりました。
指定例:
$ php-cgi PHP_FCGI_MAX_REQUESTS=0 -b 127.0.0.1:9000
そもそも PHP_FCGI_MAX_REQUESTS ってなんだろう
PHP_FCGI_MAX_REQUESTS は php-cgi の単体プロセス(?)が受け付けるリクエスト数を指定します。
本来であれば、PHP_FCGI_CHILDRENと組み合わせて利用し、PHP_FCGI_MAX_REQUESTS の回数で自動的に再起動させます。これでサードパーティのライブラリでのメモリリークの回避策として利用できるようです。
しかし、WindowsではPHP_FCGI_CHILDRENの値が有効ではなく、PHP_FCGI_MAX_REQUESTS の回数きっちりで終了してしまうということのようです。