php的幾種運行模式CLI、CGI、FastCGI、mod_php,fastcgimod_php_PHP教程

來源:互聯網
上載者:User

php的幾種運行模式CLI、CGI、FastCGI、mod_php,fastcgimod_php


1、CLI:就是命令列,例如可以在控制台或者是shell中鍵入命令:

php -f index.php

然後擷取輸出

2、CGI:以下是不同的說法與理解

公用網關介面”(Common Gateway Interface),HTTP伺服器 與你的或其它機器上的程式 進行 “交談”的一種工具 ,其程式 須運行在網路 伺服器 上。在伺服器 環境中,為“程式 ”提供標準 的介面,通過這個介面,“程式 ”可以對伺服器 與用戶端 交換的資訊 做一些事情 。“程式 ”的語 言並沒有要求。程式 對介面進行 操作。伺服器 要支援 CGI就要提供CGI中要求的環境變數 ,或者還有別的。

HTTP Server和一個獨立的進程之間的協議,把HTTP Request的Header設定成進程的環境變數,HTTP Request的本文設定成進程的標準輸入,而進程的標準輸出就是HTTP Response包括Header和本文。

這個 Web 服務器使用了 UNIX shell 環境變數 來儲存從 Web 服務器傳遞出去的參數,然後產生一個運行 CGI 的獨立進程

不同類型語言寫的程式只要符合cgi標準,就能作為一個cgi程式與web伺服器互動

以CGI方式運行時,web server將使用者請求以訊息的方式轉交給PHP獨立進程,PHP與web服務之間無從屬關係。

個人理解:CGI規定了php與web server交流的規則,相當於執行了response = exec("php -f index.php -url=xxx -cookie=xxx -xxx=xxx")。

關於CGI與CLI區別可以查看官方文檔說的挺不錯的:http://php.net/manual/zh/features.commandline.php

文中闡述了CGI與CLI的顯著區別:

以下為 CLI SAPI 和其它 CLI SAPI 模組相比的顯著區別:

  • CGI SAPI 不同,其輸出沒有任何頭資訊。

    儘管 CGI SAPI 提供了取消 HTTP 頭資訊的方法,但在 CLI SAPI 中並不存在類似的方法以開啟 HTTP 頭資訊的輸出。

    CLI 預設以安靜模式開始,但為了保證相容性,-q 和 --no-header 參數為了向後相容仍然保留,使得可以使用舊的 CGI 指令碼。

    在運行時,不會把工作目錄改為指令碼的目前的目錄(可以使用 -C 和 --no-chdir 參數來相容 CGI 模式)。

    出錯時輸出純文字的錯誤資訊(非 HTML 格式)。

3、FastCGI:CGI有很多缺點,每接收一個請求就要fork一個進程處理,只能接收一個請求作出一個響應。請求結束後該進程就會結束。而FastCGI會事先啟動起來,作為一個cgi的管理伺服器存在,預先啟動一系列的子進程來等待處理,然後等待web伺服器發過來的請求,一旦接受到請求就交由子進程處理,這樣由於不需要在接受到請求後啟動cgi,會快很多。FastCGI使用進程/線程池來處理一連串的請求。這些進程/線程由FastCGI伺服器管理,而不是Web伺服器。 當進來一個請求時,Web伺服器把環境變數和這個頁面請求通過一個Socket長串連傳遞給FastCGI進程。FastCGI像是一個常駐型的CGI,它可以一直執行,在請求到達時不會花費時間去fork一個進程來處理(這是CGI對位人詬病的fork-and-execute模式)。正是因為它只是一個通訊協定,它還支援分布式的運算,即FastCGI程式可以在網站伺服器以外的主機上執行並且接受來自其他網站伺服器的請求

FastCGI整個流程:

    1. Web server啟動時載入FastCGI進程管理器

    2. FastCGI自身初始化,啟動多個CGI解譯器進程(可見多個php-cgi)並等待來自Web server的請求

    3. 當請求Web server時,Web server通過socket請求FastCGI進程管理器,FastCGI進程管理器選擇並串連到一個CGI解譯器,Web server將CGI環境變數和標準輸入發送到FastCGI子進程php-cgi

    4. FastCGI子進程處理請求完成後將標準輸出和錯誤從同一串連返回給Web server,當FastCGI子進程結束後請求便結束。FastCGI子進程接著等待處理來自FastCGI進程管理器的下一個串連,在CGI模式中,php-cgi在此便退出了。

php-fpm:PHP的FastCGI進程管理器

4、mod_php:即apache的php模組,將PHP做為web-server的子進程式控制制,兩者之間有從屬關係.最明顯的例子就是在CGI模式下,如果修改了PHP.INI的設定檔,不用重啟web服務便可生效,而模組模式下則需要重啟web服務。以mod_php模式運行PHP,意味著php是作為apache的一個模組來啟動的,因此只有在apache啟動的時候會讀取php.ini設定檔並載入擴充模組,在apache運行期間是不會再去讀取和載入擴充模組的

Apache的工作模式 prefork的工作原理

一個單獨的控制進程(父進程)負責產生子進程,這些子進程用於監聽請求並作出應答。Apache總是試圖保持一些備用的 (spare)或是閒置子進程用於迎接即將到來的請求。這樣用戶端就無需在得到服務前等候子進程的產生。在Unix系統中,父進程通常以root身份運行以便邦定80連接埠,而 Apache產生的子進程通常以一個低特權的使用者運行。User和Group指令用於配置子進程的低特權使用者。運行子進程的使用者必須要對他所服務的內容有讀取的許可權,但是對服務內容之外的其他資源必須擁有儘可能少的許可權。

worker的工作原理

每個進程能夠擁有的線程數量是固定的。伺服器會根據負載情況增加或減少進程數量。一個單獨的控制進程(父進程)負責子進程的建立。每個子進程能夠建立ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。Apache總是試圖維持一個備用(spare)或是閒置服務線程池。這樣,用戶端無須等待新線程或新進程的建立即可得到處理。在Unix中,為了能夠綁定80連接埠,父進程一般都是以root身份啟動,隨後,Apache以較低許可權的使用者建立子進程和線程。User和Group指令用於配置Apache子進程的許可權。雖然子進程必須對其提供的內容擁有讀許可權,但應該儘可能給予他較少的特權。另外,除非使用了suexec ,否則,這些指令配置的許可權將被CGI指令碼所繼承

個人理解:這種模式把php嵌入到apache中,相當於給apache加入瞭解析php檔案的功能。

http://www.bkjia.com/PHPjc/1109844.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1109844.htmlTechArticlephp的幾種運行模式CLI、CGI、FastCGI、mod_php,fastcgimod_php 1、CLI:就是命令列,例如可以在控制台或者是shell中鍵入命令: php-findex.php 然後擷取輸...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.