當前位置:編程學習大全網 - 源碼下載 - php和cgi之間的區別

php和cgi之間的區別

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解析成了數組,我們直接取值就好了:

<?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,或者表單提交內容到頁面。可以看到輸出的數據都是結構化的,已經變成數組了。而且,HTTP頭也不需要我們自己輸出了(特殊情況除外)。

  • 上一篇:常見的數據庫有哪些
  • 下一篇:有能顯示周數的日歷app嗎?
  • copyright 2024編程學習大全網