0

私はウェブサーバーを書こうとしています。私はphp用のモジュールを書きたくなかったので、nginxやapacheのようにphp-fpmに情報を渡すことにしました。私はいくつかの調査を行い、プロトタイプをセットアップしましたが、動作させることができません。

接続ごとに print_r($GLOBALS) を行うポート 9999 でリッスンする php サービスをセットアップしました。PHPリクエストを127.0.0.1:9999に渡すようにnginxをセットアップしました。リクエストは渡されますが、argc (1) と argv (php サービスへのパス)、および $_SERVER 変数のみが入力されます。$_SERVER変数には、phpプロセスが動作している現在の環境に関する多くの情報がありますが、接続されているユーザーまたはその要求に関する情報はまったく表示されません-REMOTE_ADDR、QUERY_STRING、何もありません...

この情報をcliまたはプロトタイプサーバーからfastcgi phpプロセスに渡す方法に関するドキュメントを見つけるのに苦労しています。古い CGI vars のリストを見つけましたが、それらを渡す方法や、fastcgi で古いものがあるかどうかについての情報はありません。

繰り返しになりますが、サーバーのプロトタイプまたは cli から php-fpm または fastcgi プロセスに情報を渡す方法を尋ねています。または、この件に関する適切で明確で決定的なドキュメントをどこで見つけることができますか? (いいえ、RFC は答えではありません)。私は fastcgi.com と wikipedia だけでなく、他の多くの検索結果を読んでいます...

===更新===

PHPのプロトタイプを介して、動作するfastcgi「サービス」を起動して実行することができました。9999 でリッスンし、cli からのバイナリ fcgi リクエストを解析し、nginx からでも、バイナリ fcgi レスポンスをフォーマットし、ネットワーク経由で送り返します。cli はそれを正常に表示し、nginx はデコードされた fcgi レスポンスを自然が意図したようにブラウザ。

今、逆のことをしようとすると -- バイナリ fcgi パケットを形成し、それを PHP-FPM に送信するプロトタイプ サーバーを作成すると、cli またはエラー ログから何もエラーが出力されません (できる決して php-fpm にエラー ログに書き込ませてはなりません [-_-])。では、エラー テキスト、バイナリ ネットワーク パケット、またはその他のいずれかで、なぜ php-fpm が何らかの応答を返さないのでしょうか?

したがって、cli から fastcgi にデータを送信できますが、それが自分の fastcgi プロセスでない限り、何も戻すことができません (いいえ、私は php-fpm のポートを引き継いでいません - 私は 9999 で、それは9000 で)。

=============

ティア\m/(>_<)\m/

4

1 に答える 1

0

とった。

サーバーは、情報をネットワーク データ パケットの形式で fastcgi プロセスに渡します。DNS パケットと同じように、言語のそれぞれのバイナリ文字操作関数を使用して、ヘッダーとペイロード情報を含むパッケージを作成し、パイプ/ネットワークを介して fastcgi サーバーに送信し、バイナリ パケットを解析する必要があります。応答に。楽しいもの - もっとよく文書化されていたかもしれません、ええと:-\

ああ、php でリスナーのプロトタイプを作成する場合、任意の php 変数を介してこのパケットにアクセスすることはできません。実際には、リッスンしている接続を読み取る必要があります (これはバイナリ ネットワーク パケットであり、プレーン テキストの「投稿」データではないため)。送信済)。

PHPのプロトタイプを介して、動作するfastcgi「サービス」を起動して実行することができました。9999 でリッスンし、cli からのバイナリ fcgi 要求を解析し、nginx からでも、バイナリ fcgi 応答をフォーマットし、ネットワーク経由で送り返します。cli はそれを正常に表示し、nginx はデコードされた fcgi 応答を自然が意図したようにブラウザ。

于 2012-09-07T20:56:33.563 に答える