CGIとは、外部アプリケーション(CGIプログラム)とWebサーバー間のインターフェース規格であり、CGIプログラムとWebサーバー間で情報をやり取りするための手順です。
画像ソース http://mengkang.net/491.html
CGI の中核は、CGI が定義する環境変数です。
SERVER_NAME:运行CGI序为机器名或IP地址。SERVER_INTERFACE:WWW服务器的类型,如:CERN型或NCSA型。SERVER_PROTOCOL:通信协议,应当是HTTP/1.0。SERVER_PORT:TCP端口,一般说来web端口是80。HTTP_ACCEPT:HTTP定义的浏览器能够接受的数据类型。HTTP_REFERER:发送表单的文件URL。(并非所有的浏览器都传送这一变量)HTTP_USER-AGENT:发送表单的浏览的有关信息。GETWAY_INTERFACE:CGI程序的版本,在UNIX下为 CGI/1.1。PATH_TRANSLATED:PATH_INFO中包含的实际路径名。PATH_INFO:浏览器用GET方式发送数据时的附加路径。SCRIPT_NAME:CGI程序的路径名。QUERY_STRING:表单输入的数据,URL中问号后的内容。REMOTE_HOST:发送程序的主机名,不能确定该值。REMOTE_ADDR:发送程序的机器的IP地址。REMOTE_USER:发送程序的人名。CONTENT_TYPE:POST发送,一般为application/xwww-form-urlencoded。CONTENT_LENGTH:POST方法输入的数据的字节数。
リクエストを受け付けた後、Web サーバーはこれらの環境変数に値を割り当て、子プロセスを作成します。子プロセスでは、CGI プログラムがこれらの環境変数から値を取得します。このプロセスは CGI インターフェイスの実装です。
たとえば、Web サーバーとして C を、CGI プログラムとして PHP を取り上げます。
1. Web がソケット監視を開始すると、クライアントリクエストを受信します
GET /cgi-demo.php?a=b&c=d HTTP/1.1Host: localhost:9003Connection: keep-aliveAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,ja;q=0.2
2. Web サーバーは環境変数に値を割り当てることができます
REQUEST_METHOD GETQUERY_STRING a=b&c=dSCRIPT_NAME /cgi-demo.phpSERVER_PROTOCOL HTTP/1.1SERVER_NAME localhostSERVER_PORT 9003
3. CGI プログラムはこれらの環境変数を解析して取得します
#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(){ putenv("QUERY_STRING=a=b&c=d"); int pid = fork(); if (pid == 0) { system("php cgi-demo.php"); } return 0;}
cgi-demo.php 次に、親プロセスの Web サーバーによって設定された環境変数が子プロセスで取得されます
<?phpprintf("QUERY_STRING:%s\n", getenv("QUERY_STRING"));
上記 2 つのコードは、Web サーバーと CGI プログラムによる CGI インターフェイスの実装を示しているだけです。データの入出力は省略します。完全な Web サーバー + CGI プログラムのデモについては、http://mengkang.net/491.html を参照してください。
FastCGI の核心は、従来の fork-and-execute メソッドを排除し、各起動の複雑さ 常駐方式でリクエストを処理するオーバーヘッド。 CGI インターフェイスで定義された値を環境変数から交換するスクリプトを実行する従来の CGI とは異なり、FastCGI にはソケット サービス対話の追加層があり、Web サーバーは FastCGI に続くパッケージに CGI インターフェイス データをカプセル化する必要があります。プロトコルを作成し、分析プログラムのために FastCGI に送信します。公式には、FastCGI プロセス マネージャーはソケットに基づいているため、分散型でもあり、Web サーバーと CGI プログラムを分散方式で展開できます。
コーディング...
コーディング...
http://www.php-internals.com/book/?p=chapt02/02- 02- 03-fastcgi
http://www.fastcgi.com/devkit/doc/fcgi-spec.html
http://andylin02.iteye.com/blog/648412 (中国語版)
http://my.oschina.net/goal/blog/196599