PHPは最も一般的なプログラミング言語の1つです。 小さなホームページを書くために設計され、徐々に成長し、現在では何百万ものウェブサイトで使用されています。 ただし、問題はWebサイトに限定されません-インタラクティブ、CGI、FastCGIモードがあるため、ほとんどすべてのアプリケーションで使用できます。
CGIモードについて説明したいと思います。 その利点は、比較的単純であり、さまざまなデータをスクリプト(バイナリを含む)に送信できることです。 彼はたった1つのマイナスを持っています-アプリケーションの繰り返しの起動による仕事の速度。 ただし、このマイナスは、新しいFastCGIプロトコルを使用して修正されます。
最初に、Common Gateway Interface(CGI)とは何かを定義しましょう。 実際、これは特定の環境変数でアプリケーションを起動するだけです。 これはまだWebテクノロジーであるため、変数はHTTPプロトコルと密接に関連しています。
RFC 3875を見て、CGI / 1.1に必要な環境変数を確認してください。
- AUTH_TYPE-HTTP認証のタイプ(基本、ダイジェストなど)は空の場合があります。
- CONTENT_LENGTH-POSTまたはPUT要求で送信されるデータの長さ。 通常、リクエストのContent-Lengthヘッダーから取得されます。
- CONTENT_TYPE-POSTまたはPUTリクエストで送信されるデータのタイプ。 通常、リクエストのContent-Typeヘッダーから取得されます。
- GATEWAY_INTERFACE-使用されているCGIのバージョン。 通常、「CGI / 1.1」。
- PATH_INFO-CGIアプリケーションへのパスの後、リクエスト変数の前のパスの一部。 たとえば、クエリ「/somewhere/cgiapp.exe/test/?qwerty=123」の場合、「/ test /」になります。
- PATH_TRANSLATEDはPATH_INFOと同じですが、ファイルシステムに投影されます。 たとえば、「./ htdocs / test /」。
- QUERY_STRING-クエリ変数(疑問符なし)。 たとえば、「qwerty = 123」。
- REMOTE_ADDR-リモートユーザーのIPアドレス。
- REMOTE_HOST-リモートユーザーのドメイン名。 通常、REMOTE_ADDRと同じです。
- REMOTE_IDENT- RFC 1314に準拠したユーザー識別データ。 めったに使用されません。
- REMOTE_USER-HTTP認証に合格したリモートユーザーの名前。
- REQUEST_METHOD-要求タイプ(GET、POST、PUTなど)
- SCRIPT_NAME-CGIアプリケーションへのパスを持つリクエストの一部。 たとえば、「/ somewhere / cgiapp.exe」。
- SERVER_NAME-サーバー名(ホスト名またはドメイン名)。
- SERVER_PORT-サーバーが実行されているポート。
- SERVER_PROTOCOL-サーバーが使用するプロトコル。 通常は「HTTP / 1.1」。
- SERVER_SOFTWARE-サーバーのバージョン。 たとえば、「MyServer 1.0」。
POSTおよびPUT要求の場合、要求データはアプリケーションの標準入力に転送されます。
ただし、php-cgiを実行するには、これらの変数はすべて望ましいだけですが、必須ではありません。 必要な環境変数は1つだけで、RFCで指定されていない場合でも-SCRIPT_FILENAME。 ファイルシステム内のPHPスクリプトへのパス(「/home/some-user/htdocs/test.php」など)を含める必要があります。 アプリケーションのCGIを介してPHPスクリプトを実行するには、スクリプトを指定してphp-cgi(「php」ではなく「php-cgi」!)を実行し、その標準入出力をリダイレクトするだけです。
Webサーバーを作成していない場合は、出力PHPヘッダーをトリミングする必要があります。 出力をインターセプトし、最初の空の行が表示されるまで待機し(行に2つだけ改行します-"\ n \ n")、その後の行のみを使用します。
CGIモードのPHPは、スクリプトで非常に積極的に作業する必要がない場合にのみ使用し、スクリプトにデータや変数を渡すことをお勧めします。 アクティブな作業が必要な場合は、FastCGIを使用することをお勧めしますが、スクリプトに何も渡す必要がない場合は、スクリプトへのパスを引数として渡すことで、PHPインタープリターを簡単に起動できます。
根拠がないように、作業の小さな例(Windows、C#):
using System; using System.Diagnostics; namespace PhpApp { class Program { static void Main(string[] args) { Process php = new Process();
