cgi是壹種接口,不管用什麽語言都可以按照這個接口進行實現。壹般服務器判斷需要調用cgi程序前,會把請求的GET參數放在環境變量QUERY_STRING裏,POST請求內容則通過標準輸入流輸送到cgi程序內。cgi程序只需要將HTTP協議(包括HTTP頭和HTTP Body)打印到標準輸出流stdout,服務器就會把它們直接傳輸給瀏覽器。
舉個栗子:
//c++實現cgi接口,打印query?string和post?data#include?<iostream>
using?namespace?std;
int?main()?{
cout?<<?"Content-type:text/html\n\n";
const?char?*queryString?=?getenv("QUERY_STRING");
if?(queryString?!=?NULL)?{
cout?<<?"<h1>query?string?is?:"?<<?queryString?<<?"</h1>"?<<?endl;
}?else?{
cout?<<?"<p>No?query?string</p>"?<<?endl;
}
string?postData,?tmpData;
while(cin?>>?tmpData)?{
postData?+=?tmpData;
}
if?(postData?!=?"")?{
cout?<<?"<div>?"?<<?postData?<<?"?</div>"?<<?endl;
}?else?{
cout?<<?"<p>No?post?data</p>"?<<?endl;
}
return?0;
}
把它編譯好,命名為test.cgi,然後扔到服務器到cgi目錄裏。然後訪問類似於http://localhost/cgi/test.cgi?a=b&c=d的URL,服務器就會把a=b&c=d放到QUERY_STRING環境變量中傳給test.cgi。最後能看到頁面上顯示出query string is a=b&c=d。也可以創建壹個表單,把數據POST到http://localhost/cgi/test.cgi,然後可以看到頁面上顯示出所有的POST data。
php是壹種腳本語言,它可以用來做很多事。。。比如說用來寫CGI程序:
#!/usr/env?php<?php
echo?"Content-type:text/html\n\n";
$queryString?=?$_ENV("QUERY_STRING");
if?($queryString?!=?NULL)?{
echo?"<h1>query?string?is?:?$queryString</h1>";
}?else?{
echo?"<p>No?query?string</p>";
}
$postData?=?file_get_contents("php://stdin");
if?($postData?!=?"")?{
echo?"<div>?$postData?</div>";
}?else?{
echo?"<p>No?post?data</p>";
}
>好吧它的功能跟上面C++寫的程序壹毛壹樣,我們把它加上“可執行屬性”chmod +x testphp.cgi然後扔到cgi目錄,然後訪問http://localhost/cgi/testphp.cgi?a=b&c=d,以及用表單post數據給它,看到的效果應該是壹樣的。
所以妳也看到了,服務器調用CGI程序,它才不管妳用啥實現的,反正接口都定好了,只要按接口來編程就行。
但壹般服務器調用PHP和調用CGI程序的邏輯不壹樣。CGI程序需要自己解析QUERY_STRING和POST_DATA,PHP應該是通過另壹套擴展跟服務器交互的,所以壹般用PHP直接寫網頁的時候,寫網頁的方式跟平時還真不太壹樣,比如說,服務器的php擴展已經幫我們把query string和post data解析成了數組,我們直接取值就好了:
<?phpif?(isset($_GET))?{
print_r($_GET);
}?else?{
echo?"<p>No?query?string</p>";
}
if?(isset($_POST))?{
print_r($_POST);
}?else?{
echo?"<p>No?post?data</p>";
}
>存成test.php之後訪問http://localhost/test.php?a=b&c=d,或者表單提交內容到頁面。可以看到輸出的數據都是結構化的,已經變成數組了。而且,HTTP頭也不需要我們自己輸出了(特殊情況除外)。