FastCGI は、Web サーバーとスクリプト言語間のスケーラブルな高速通信インターフェイスです。 FastCGI テクノロジーの詳細については、公式 Web サイトと Wikipedia をご覧ください。
最も一般的な Web サーバーは FastCGI をサポートしています。 Apache (mod_fastcgi および mod_fcgid)、Zeus、nginx、lighttpd が含まれます。
FastCGI の主な利点は、動的言語を Web サーバーから分離できることです。このテクノロジーにより、Web サーバーと動的言語を異なるホスト上で実行できるようになります。これにより、効率を大幅に損なうことなく、スケーラビリティとセキュリティが向上します。
php に付属する spawn-fcgi + spawn-php.sh + daemontools php-fpm について説明します
php デーモン化: pid ファイル、ログ ファイル、setsid()、setuid()、setgid()、chroot( ) | (-) | (+) | (+) |
プロセス管理。 「グレースフル」を使用すると、リクエストを失うことなく PHP ワーカー プロセスを停止および開始できます。リクエストを失うことなく、構成とバイナリをスムーズにアップグレードする機能。 | php4 (-)、php5 (gracefulのみ) | (-) | (+) |
ソースから要求されるWebサーバーのIPアドレスを厳しく制限する | php4 (-) php5 (+) ( 5.2から。2 Start) | (-) | (+) |
負荷に応じてプロセス数を動的に調整 | (-) | (-) | Todo |
別のuを使用ID/ gid/chroot/environ ment とさまざまな php.ini オプションを使用してワード プロセスを開始します。もうセーフモードは必要ありません。 | (-) | (-) | (+) |
ワーカープロセスのstdoutおよびstderrログを記録する | (-) | (-) | (+) |
オプティマイザーを使用している場合、共有メモリが誤って破壊された場合に、すべてのプロセスを緊急再起動します | (-) | (-) | (+) |
set_time_limit() が失敗した場合、プロセスが確実に終了するようにします | (-) | ( -) | (+) |
機能 エラーヘッダー、最適化されたアップロードサポート、fastcgi_finish_request() |
機能
これらの機能はすべて「非中断」方法で実装されます。つまり、これらを使用しない場合、それらの存在は PHP の機能に影響を与えません。それらはすべて「透過的」です。
エラーヘッダー
スコープ: php.ini オプション
カテゴリ: 利便性
デフォルトでは、アクセスされた php スクリプトに構文エラーが含まれている場合、ユーザーは空の「200 ok」ページを受け取ります。これは不便です。エラー ヘッダー この php.ini オプションを使用すると、この場合、「HTTP/1.0 550 Server Made Big Boo」などの HTTP エラー コードを生成できるため、Web サーバーのリクエストが中断され、正しいエラー ページが表示されます。
そのような関数を実装したい場合は、php.ini に fastcgi.error_header = "HTTP/1.0 550 Server Made Big Boo" を追加する必要があります
同じではないが似た関数が php- に追加されています5.2.4: アクセスした PHP スクリプトに構文エラーがあり、display_errors = off の場合、すぐに「HTTP/1.0 500 Internal Server Error」が返されます。
503 エラーを設定する必要がある場合、またはこの動作を display_errors 設定とは独立させたい場合は、fastcgi.error_header を使用できます。 php-5.2.5 以降で php-fpm を有効にすると、fastcgi.error_header の優先度が高くなります。
最適化されたアップロード サポート
本質: Web サーバー サポート
タイプ: 最適化
名前が示すように、この機能はファイルのアップロードを含む大規模な POST リクエストの処理を高速化できます。最適化は、リクエスト本文を一時ファイルに書き込むことによって実現され、その後、fastcgi プロトコルはリクエスト本文の代わりにファイル名を渡します。私の知る限り、この機能をサポートしているのはnginx0.5.9以降のみです。明らかに、このモードは PHP と Web サーバーが同じマシン上にある場合にのみ使用できます。
nginx のサンプル構成:
location ~ .php$ {
client_body_in_file_only clean;
fastcgi_pass ...;
PHP では何も設定する必要はありません。 php がパラメータ REQUEST_BODY_FILE を受信した場合は、リクエストの本文を読み取ります。そうでない場合は、fastcgi プロトコルからリクエストの本文を読み取ります。
この機能と組み合わせると、tmpfs (Linux) などの一時ファイルにインメモリ ファイル システムを使用することを検討できます:
client_body_temp_path /dev/shm/client_body_temp;
fastcgi_finish_request()
スコープ: php 関数タイプ: 最適化
この機能は、一部の PHP リクエストの処理速度を向上させることができます。この最適化は、ページの生成後に何らかの処理を実行できる場合に使用できます。たとえば、memcached へのセッションの保存は、ページが Web サーバーに渡された後に行うことができます。 fastcgi_finisth_request() を使用すると、この機能により応答出力を終了でき、Web サーバーはすぐに応答出力をせっかちなクライアントに渡し始めることができます。この時点で、PHP は要求のコンテキストで多くのことを処理できます。セッションの保存、アップロードされたビデオの変換、統計の処理など。
fastcgi_finisth_request() はシャットダウン関数の実行をトリガーします。
request_slowlog_timeout スコープ: php-fpm.conf オプション
カテゴリ: 便利
このオプションを使用すると、遅いスクリプトを追跡し、コールスタックとともにログファイルに記録できます。たとえば、次の設定:
5s
記録が遅い.log 次のようになります:
SEP 21 16:22: 19.399162 PID 29715 (POOL DEFAULT)
Script_filename = /Local/www/stable/cataLogue.php
[0x00007FFFF23618120] mysql_query ()/SR V/安定/親しみやすい/データベース/class.MySQLRequest.php:20
[0x00007fff23618560] getResult() /srv/stable/common/Database/class.Facade.php:106 [0x00007fff23618aa0] query() /srv/stable/common/mysite.com / ORM/class.UsersMapper.php:99 [0x00007fff23618d60]solveByID() /srv/stable/common/mysite.com/ORM/class.User.php:629
[0x00007fff236193b0] getData() /srv/stable/common / class.DataEntity.php:90 [0x00007fff236195d0]load() /srv/stable/common/mysite.com/ORM/class.User.php:587
[0x00007fff23619a00] getIsHidden() /srv/stable/common/mysite .com/class.User.php:42
[0x00007fff2361a470] getName() /local/www/stable/www/catalogue.php:41
同時に、次のレコードが error.log に保存されます。
Sep 21 16:22:19.399031 [警告] fpm_request_check_timed_out()、135 行目: 子 29715、スクリプト '/local/www/stable/www/catalogue.php' (プールのデフォルト) の実行が遅すぎます (5.018002 秒)、ログ記録
例でわかるように、スクリプトの実行には 5 秒以上かかりました。これは、mysql (トップ バックトレース) の応答が遅いことが原因である可能性が高くなります。
FAQ
Q: php-fpm は ZendOptimize で使用できますか?
A: もちろんです。
Q: php-fpm は ZendPlatform、xcache、eAccelerator、APC などのオプティマイザーと一緒に使用できますか?
A: はい。 php-fpm のアーキテクチャは、高速オペコード キャッシュのためにあらゆる種類の共有メモリで動作します。唯一の制限は、異なる uid/gid で実行されている場合でも、すべてのワーカー プロセスに適用できるキャッシュは 1 つだけです
Q: なぜ php にパッチを適用する必要があるのですか? spawn-fcgi にはこれは必要ありません。
A: php-fpm は、管理を強化し、容易にするために作成されました。パッチが適用されていない PHP では次のことができません:
PHP バイナリや拡張機能のアップグレードなど、リクエストを失うことなく PHP を正常に再起動します。
異なる uid/gid/chroot 環境でワーカープロセスを実行
すべての設定に対応する構成ファイルは 1 つだけ
負荷に基づいた動的リクエスト (TODO)
PHP リクエストのリアルタイム統計パフォーマンス (TODO)
Q: なぜですかrootで実行 php-fpmはどうですか?これは安全ですか?
A: root として php-fpm を開始することは、リクエストを処理するために異なる uid/gid を持つ php を使用する予定がある場合にのみ意味があります。たとえば、共有ホスティング上のさまざまなサイトです。マスタープロセスが root として実行されている場合にのみ、異なる uid/gid を持つサブプロセスを作成できるためです。とても安全です。マスタープロセス自体はリクエストを処理しません。
いかなる状況でも、php-fpm はリクエストを root として処理しません。
Q: php-fpm は php スクリプトの処理を高速化できますか?
A: いいえ、処理速度には影響しません。ただし、いくつかの特別な機能を使用すると、特定のリクエストのパフォーマンスを向上させることができます。
Q: Web サイトを mod_php から php-fpm に移行すると、パフォーマンスは向上しますか?
A: 通常、サーバー上で使用可能な空きメモリが大量にある場合、php-fpm への移行によるパフォーマンスの向上は大きくない可能性があります。ただし、メモリが豊富でない場合でも、パフォーマンスの向上は大きく、場合によっては 300 ~ 500% に達します。これは、一般的に nginx + php-fpm が Apache + mod_php よりもメモリ使用量が少ないためである可能性があります。また、空きメモリが増えるため、VFS キャッシュはより効率的に動作します。
Q: php-fpm は将来、公式の php に含まれる予定ですか?
A: そうだといいですね。現在、php-fpm コードは GPL に基づいてライセンスされています。したがって、php-fpm のコードは php プロトコル (bsd と同様) と一致しません。これは一時的な措置です。この選択は、開発プロセスを簡素化するために行われます。適応的に子プロセスを生成するなど、コードが完全に機能すると、プロトコルは一致するものに変更されます。その後、php-fpm は PHP 開発チームに正式にリリースされ、含めることが推奨されます。
Documentation
php-fpm は Linux、MacOSX、Solaris、FreeBSD でテストされています。
libxml2 (システムによっては libxml2-devel と呼ばれる) がインストールされていることを確認してください。
最小の php と php-fpm をダウンロードします
$ bzip2 -cd php-5.2.5.tar.bz2 tar xf -
$ gzip -cd php-5.2.5-fpm-0.5.7.diff.gz | patch -d php-5.2.5 -p1
$ cd php-5.2.5
$ ./configure --enable-fastcgi --enable-fpm
$ make all install
edit
$prefix/etc /php-fpm.conf
Run
$prefix/bin/php-cgi --fpm
よく確認してください
$prefix/logs/php-fpm.log
phpinfo() を実行して、あなたのウェブサイトはまだ正常に動作していますか?
マスタープロセスの pid は
$prefix/logs/php-fpm.pid に保存されています
マスタープロセスは次の信号を理解できます:
SIGINT, SIGTERM | 即時終了 |
SIGQUIT | スムーズな終了 |
SIGUSR1 | ログファイルを再度開く |
SIGUSR2 | スムーズなリすべてのワーカープロセスをロードし、構成とバイナリをリロードします |
概要
こんにちは、私の名前は Andrei Nigmatulin です。php-fpm の作者です。
2004 年以来、私は誰かが実稼働環境に適した PHP FastCGI を作成してくれることを待ち続けてきましたが、もう待ちきれません。
php-fpm は、いくつかのプロジェクトで PHP の FastCGI SAPI を使用した作業から得られた知識、経験、アイデアの産物です。
php-fpm は GPL ライセンスに基づいて公的に使用できます。 php-fpm にバンドルされている libevent の修正バージョンは、BSD ライセンスの下でリリースされます。
php FastCGI SAPI を改善および最適化するために、フィードバック??新しいアイデアや提案??が必要です。 アイデア、コメント、追加、提案がありましたら、喜んで聞いて、実装するかもしれません。メールを送ってください。 (アドレスはこのページの最後にあります)。
php-fpm の開発をサポートしたい場合は、いくつかの寄付を行うことができます: Paypal Yandex.Money
2007/05/15 - php-fpm.への最初の送信
andrei dot nigmatulin at gmail dot com 注釈:
php-fpm には、$prefix/sbin/php-fpm にある、より便利なスクリプトも付属しています。 php-fpm start|graceful|restart|stop を使用して維持できます。少し編集するだけで、設定ファイルを使用できるようになります。
追記:
最初、php-fpmにはロシア語のドキュメントしかなく、とても落ち込んだので、まずGoogle翻訳を使って英語に翻訳し、その後手動で中国語に翻訳しました。自分の英語力に起因するミスに加えて、ミスが増えるのは避けられません。その後、ついに英語の wiki ができ、私は中国語の翻訳を提供するよう誘われました。同時に、前回の翻訳 (2008 年 5 月) 以降、原文書が更新されています。そこで英語wikiをもとに再翻訳してみました。
リダイレクト: http://www.21andy.com/blog/20100219/1700.html