本文目錄一覽:
- 1、PHP運行模式是ISAPI和CGI的區別?
- 2、什麼是PHP的CGI模式
- 3、服務器的php運行是php-cgi模式
- 4、php和cgi之間的區別
- 5、php 與 php-cgi問題
- 6、什麼是CGI,FastCGI,PHP-CGI,PHP-FPM,Spawn-FCGI
PHP運行模式是ISAPI和CGI的區別?
ISAPI執行方式是以DLL動態庫的形式使用,它能實現CGI提供的全部功能,並在此基礎上進行了擴展,可以在被用戶請求後執行,在處理完一個用戶請求後不會馬上消失,這樣來提高程序的執行效率;
CGI執行方式,把網頁和WEB服務器中的執行程序連接起來,它把HTML接收的指令傳遞給服務器的執行程序,再把服務器執行程序的結果返還給HTML頁。CGI 的跨平台性能極佳,幾乎可以在任何操作系統上實現。 CGI方式在遇到連接請求(用戶請求)先要創建cgi的子進程,激活一個CGI進程,然後處理請求,處理完後結束這個子進程。這就是fork-and-execute模式。所以用cgi 方式的服務器有多少連接請求就會有多少cgi子進程,子進程反覆加載是cgi性能低下的主要原因。都會當用戶請求數量非常多時,會大量擠占系統的資源如內存,CPU時間等,造成效能低下。
什麼是PHP的CGI模式
CGI即通用網關接口(Common Gateway Interface),它是一段程序,通俗的講CGI就象是一座橋,把網頁和Web服務器中的執行程序連接起來,它把HTML接收的指令傳遞給服務器的執行程序,再把服務器執行程序的結果返還給HTML頁。CGI 的跨平台性能極佳,幾乎可以在任何操作系統上實現。
服務器的php運行是php-cgi模式
檢查 PHPINFO 里 確定是ISAPI了嗎?
可以設置每個網站運行的帳號 不用默認的IIS_帳號 這樣即安全 又可以在任務管理器中跟蹤….
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 “h1query string is :” queryString “/h1” endl;
} else {
cout “pNo query string/p” endl;
}
string postData, tmpData;
while(cin tmpData) {
postData += tmpData;
}
if (postData != “”) {
cout “div ” postData ” /div” endl;
} else {
cout “pNo post data/p” endl;
}
return 0;
}
把它編譯好,命名為test.cgi,然後扔到服務器到cgi目錄里。然後訪問類似於;c=d的URL,服務器就會把a=bc=d放到QUERY_STRING環境變量中傳給test.cgi。最後能看到頁面上顯示出query string is a=bc=d。也可以創建一個表單,把數據POST到,然後可以看到頁面上顯示出所有的POST data。
php是一種腳本語言,它可以用來做很多事。。。比如說用來寫CGI程序:
#!/usr/env php
?php
echo “Content-type:text/html\n\n”;
$queryString = $_ENV(“QUERY_STRING”);
if ($queryString != NULL) {
echo “h1query string is : $queryString/h1”;
} else {
echo “pNo query string/p”;
}
$postData = file_get_contents(“php://stdin”);
if ($postData != “”) {
echo “div $postData /div”;
} else {
echo “pNo post data/p”;
}
?
好吧它的功能跟上面C++寫的程序一毛一樣,我們把它加上「可執行屬性」chmod +x testphp.cgi然後扔到cgi目錄,然後訪問;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 “pNo query string/p”;
}
if (isset($_POST)) {
print_r($_POST);
} else {
echo “pNo post data/p”;
}
?
存成test.php之後訪問;c=d,或者表單提交內容到頁面。可以看到輸出的數據都是結構化的,已經變成數組了。而且,HTTP頭也不需要我們自己輸出了(特殊情況除外)。
php 與 php-cgi問題
建議你暫時放開CGI,實在放不下就看看下面的啰嗦:CGI是一種協議,是WEB服務器調用可執行程序的協議。PHP一般有兩種工作模式,一是作為模塊,一是作為CGI。因此CGI和PHP就發生了關係。
什麼是CGI,FastCGI,PHP-CGI,PHP-FPM,Spawn-FCGI
CGI全稱是「公共網關接口」(Common
Gateway
Interface),HTTP服務器與你的或其它機器上的程序進行「交談」的一種工具,其程序須運行在網絡服務器上。
FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行着,只要激活後,不會每次都要花費時間去fork一次(這是CGI最為人詬病的fork-and-execute
模式)。它還支持分佈式的運算,
即
FastCGI
程序可以在網站服務器以外的主機上執行並且接受來自其它網站服務器來的請求。
PHP-CGI是PHP自帶的FastCGI管理器。
PHP-FPM是一個PHP
FastCGI管理器,是只用於PHP的
Spawn-FCGI是一個通用的FastCGI管理服務器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI進行FastCGI模式下的管理工作,不過有不少缺點。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/307077.html