區(qū)別:cgi是協(xié)議和標(biāo)準(zhǔn),是一種規(guī)范,不是語言;遵循這個(gè)標(biāo)準(zhǔn)就可以用各種語言(包括php)編寫程序處理網(wǎng)頁請(qǐng)求和返回?cái)?shù)據(jù)到客戶端瀏覽器。而php是一個(gè)動(dòng)態(tài)網(wǎng)頁開發(fā)語言,php可以以cgi方式工作,也可以isapi、nsapi等模塊方式工作。
cgi是通用網(wǎng)關(guān)協(xié)議,是開發(fā)動(dòng)態(tài)網(wǎng)頁的一個(gè)標(biāo)準(zhǔn),遵循這個(gè)標(biāo)準(zhǔn)就可以用bat、cmd、sh、perl、c、c 、perl以及php等語言編寫程序處理網(wǎng)頁請(qǐng)求和返回?cái)?shù)據(jù)到客戶端瀏覽器。cgi是協(xié)議和標(biāo)準(zhǔn),是一種規(guī)范,不是語言。
cgi是一種接口,不管用什么語言都可以按照這個(gè)接口進(jìn)行實(shí)現(xiàn)。一般服務(wù)器判斷需要調(diào)用cgi程序前,會(huì)把請(qǐng)求的get參數(shù)放在環(huán)境變量query_string里,post請(qǐng)求內(nèi)容則通過標(biāo)準(zhǔn)輸入流輸送到cgi程序內(nèi)。cgi程序只需要將http協(xié)議(包括http頭和http body)打印到標(biāo)準(zhǔn)輸出流stdout,服務(wù)器就會(huì)把它們直接傳輸給瀏覽器。
//c 實(shí)現(xiàn)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,然后扔到服務(wù)器到cgi目錄里。然后訪問類似于http://localhost/cgi/test.cgi?a=b&c=d的url,服務(wù)器就會(huì)把a(bǔ)=b&c=d放到query_string環(huán)境變量中傳給test.cgi。最后能看到頁面上顯示出query string is a=b&c=d。也可以創(chuàng)建一個(gè)表單,把數(shù)據(jù)post到http://localhost/cgi/test.cgi,然后可以看到頁面上顯示出所有的post data。
php是一個(gè)動(dòng)態(tài)網(wǎng)頁開發(fā)語言,主要用于處理瀏覽器提交的數(shù)據(jù)以及返回結(jié)果給瀏覽器。php可以以cgi方式工作,也可以以isapi、nsapi等模塊方式工作。
php寫cgi程序:
#!/usr/env php<?phpecho "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 寫的程序一毛一樣,我們把它加上“可執(zhí)行屬性”chmod x testphp.cgi然后扔到cgi目錄,然后訪問http://localhost/cgi/testphp.cgi?a=b&c=d,以及用表單post數(shù)據(jù)給它,看到的效果應(yīng)該是一樣的。
所以你也看到了,服務(wù)器調(diào)用cgi程序,它才不管你用啥實(shí)現(xiàn)的,反正接口都定好了,只要按接口來編程就行。
但一般服務(wù)器調(diào)用php和調(diào)用cgi程序的邏輯不一樣。cgi程序需要自己解析query_string和post_data,php應(yīng)該是通過另一套擴(kuò)展跟服務(wù)器交互的,所以一般用php直接寫網(wǎng)頁的時(shí)候,寫網(wǎng)頁的方式跟平時(shí)還真不太一樣,比如說,服務(wù)器的php擴(kuò)展已經(jīng)幫我們把query string和post data解析成了數(shù)組,我們直接取值就好了:
<?php if (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,或者表單提交內(nèi)容到頁面。可以看到輸出的數(shù)據(jù)都是結(jié)構(gòu)化的,已經(jīng)變成數(shù)組了。而且,http頭也不需要我們自己輸出了(特殊情況除外)。
更多相關(guān)知識(shí),請(qǐng)?jiān)L問:php中文網(wǎng)!