搜尋
首頁後端開發PHP問題php有幾種運行模式

php有幾種運行模式

關於PHP目前比較常見的五大運行模式:

(1)CGI(通用網關介面/ Common Gateway Interface)

(2)FastCGI(常駐型CGI / Long-Live CGI)

(3)CLI(命令列運行/ Command Line Interface)

(4)Web模組模式( Apache等Web伺服器運作的模式) 

(5)ISAPI(Internet Server Application Program Interface)

備註:在PHP5.3以後,PHP不再有ISAPI模式,安裝後也不再有php5isapi.dll這個檔。要在IIS6上使用高版本PHP,必須安裝FastCGI 擴展,然後使IIS6支援FastCGI。

一、CGI模式

CGI即通用網關介面(Common Gateway Interface),它是一段程序,通俗的講CGI就像是一座橋,把網頁和Web伺服器中的執行程序連接起來,它把HTML接收的指令傳遞給伺服器的執行程序,再把伺服器執行程序的結果回還給HTML頁。 CGI 的跨平台效能極佳,幾乎可以在任何作業系統上實現。 CGI已經是比較老的模式了,這幾年都很少用了。 

每有一個使用者請求,都會先要建立CGI的子進程,然後處理請求,處理完後結束這個子進程,這就是Fork-And-Execute模式。當使用者請求數量非常多時,會大量擠佔系統的資源如內存,CPU時間等,造成效能低。所以用CGI方式的伺服器有多少連線請求就會有多少CGI子進程,子進程反覆載入是CGI效能低下的主要原因。 

如果不想把 PHP 嵌入到伺服器端軟體(如 Apache)作為一個模組安裝的話,可以選擇以 CGI 的模式安裝。或把 PHP 用於不同的 CGI 封裝以便為程式碼建立安全的 chroot 和 setuid 環境。這樣每個客戶機請求一個PHP文件,Web伺服器就呼叫php.exe(win下是php.exe,linux是php)去解釋這個文件,然後再把解釋的結果以網頁的形式傳回給客戶機。這種安裝方式通常會把 PHP 的執行檔安裝到 web 伺服器的 cgi-bin 目錄。 CERT 建議書 CA-96.11 建議不要把任何的解釋器放到 cgi-bin 目錄。這種方式的好處是把Web Server和具體的程式處理獨立開來,結構清晰,可控性強,同時缺點就是如果在高存取需求的情況下,CGI的進程Fork就會成為很大的伺服器負擔,想像數百個並發請求導致伺服器Fork出數百個進程就明白了。這也是為什麼CGI一直背負著表現低下,高資源消耗的惡名的原因。

相關推薦:《php入門教學

#二、FastCGI模式

FastCGI是CGI的升級版本,FastCGI像是常駐(long-live)型的CGI,它可以一直執行著,只要激活後,不會每次都要花費時間去Fork 一次(這是CGI 最為人詬病的fork-and- execute 模式)。 

FastCGI是一個可伸縮地、高速地在HTTP server和動態腳本語言間通訊的介面。多數流行的HTTP server都支援FastCGI,包括Apache、Nginx和lighttpd等,同時,FastCGI也被許多腳本語言所支持,其中就有PHP。

FastCGI介面方式採用C/S結構,可以將HTTP伺服器和腳本解析伺服器分開,同時在腳本解析伺服器上啟動一個或多個腳本解析守護程式。當HTTP伺服器每次遇到動態程式時,可以直接交付給FastCGI進程來執行,然後將得到的結果傳回瀏覽器。這種方式可以讓HTTP伺服器專一地處理靜態請求或將動態腳本伺服器的結果傳回給客戶端,這在很大程度上提高了整個應用系統的效能。

【原理】

(1)Web Server啟動時載入FastCGI進程管理器(IIS ISAPI或Apache Module); 

#(2 )FastCGI進程管理器本身初始化,啟動多個CGI解釋器進程(可見多個php-cgi.exe或php-cig)並等待來自Web Server的連線; 

(3)當客戶端請求到達Web Server時,FastCGI進程管理器選擇並連線到一個CGI解釋器。 Web server將CGI環境變數和標準輸入傳送至FastCGI子進程php-cgi; 

#(4)FastCGI子進程完成處理後將標準輸出和錯誤訊息從相同連線傳回Web Server。當FastCGI子程序關閉連線時,請求便告處理完成。 FastCGI子進程接著等待並處理來自FastCGI進程管理器(運行在 WebServer中)的下一個連線。在正常的CGI模式中,php-cgi.exe在此便退出了。 

在CGI模式中,你可以想像CGI通常有多慢。每一個Web請求PHP都必須重新解析php.ini、重新載入全部dll擴充並重初始化全部資料結構。使用FastCGI,所有這些都只在進程啟動時發生一次。一個額外的好處是,持續資料庫連線(Persistent database connection)可以運作。 

備註:PHP的FastCGI進程管理器是PHP-FPM(PHP-FastCGI Process Manager)

【優點】

##(1)從穩定性上看,FastCGI是以獨立的進程池來運行CGI,單獨一個進程死掉,系統可以很輕易的丟棄,然後重新分配新的進程來運行邏輯; 

#(2)從安全性上看,FastCGI支援分散式運算。 FastCGI和宿主的Server完全獨立,FastCGI怎麼down也不會把Server搞垮; 

#(3)從效能來看,FastCGI把動態邏輯的處理從Server中分離出來,大負荷的IO處理還是留給宿主Server,這樣宿主Server可以一心一意作IO,對於一個普通的動態網頁來說, 邏輯處理可能只有一小部分,大量的是圖片等靜態。   

【缺點】 

說完了好處,也來說說缺點。從我的實際使用來看,用FastCGI模式比較適合生產環境的伺服器。但對於開發用機器來說就不太適合。因為當使用 Zend Studio偵錯程式時,由於 FastCGI會認為 PHP進程逾時,因此在頁面傳回 500錯誤。這點讓人非常惱火,所以我在開發機器上還是換回了 ISAPI模式。對某些伺服器的新版本支援不好,對分散式負載平衡沒要求的模組化安裝是否是更好的選擇。目前的FastCGI和Server溝通還不夠智能,一個FastCGI進程如果執行時間過長會被當成是死進程殺掉重起,這樣在處理長時間任務的時候很麻煩,這樣做也使得FastCGI無法允許聯機調試。因為是多進程,所以比CGI多線程消耗更多的伺服器內存,PHP-CGI解釋器每進程消耗7至25兆內存,將這個數字乘以50或100就是很大的內存數。


三、CLI模式

PHP-CLI是PHP Command Line Interface的簡稱,如同它名字的意思,就是PHP在命令列運行的接口,區別於在Web伺服器上運行的PHP環境(PHP-CGI,ISAPI等)。也就是說,PHP不單可以寫前台網頁,它也可以用來寫後台的程式。 PHP的CLI Shell腳本適用於所有的PHP優勢,使創建要么支援腳本或系統甚至與GUI應用程式的服務端,在Windows和Linux下都是支援PHP-CLI模式的。


【優點】 

(1)使用多進程,子進程結束以後,核心會負責回收資源; 

(2 )使用多進程,子進程異常退出不會導致整個進程Thread退出,父進程還有機會重建流程; 

(3)一個常駐主進程,只負責任務分發,邏輯更清楚。 

我們在Linux下經常使用"php –m"查找PHP安裝了那些擴充就是PHP命令列運作模式;有興趣的同學可以輸入"php –h"去深入研究該運行模式。

四、模組模式 

模組模式是以mod_php5模組的形式集成,此時mod_php5模組的作用是接收Apache傳遞過來的PHP檔案請求,並處理這些請求,然後將處理後的結果傳回給Apache。如果我們在Apache啟動前在其設定檔中設定好了PHP模組(mod_php5),PHP模組透過註冊apache2的ap_hook_post_config掛鉤,在Apache啟動的時候啟動此模組以接受PHP檔案的請求。

除了這種啟動時的載入方式,Apache的模組可以在運行的時候動態裝載,這意味著對伺服器可以進行功能擴展而不需要重新對原始碼進行編譯,甚至根本不需要停止伺服器.我們所需要做的只是給伺服器發送訊號HUP或AP_SIG_GRACEFUL通知伺服器重新載入模組。但是在動態載入之前,我們需要將模組編譯成為動態連結函式庫。此時的動態載入就是載入動態連結庫。 Apache中對動態連結函式庫的處理是透過模組mod_so來完成的,因此mod_so模組不能被動態載入,它只能被靜態編譯進Apache的核心。這意味著它是隨著Apache一起啟動的。 


Apache是​​如何載入模組的呢?我們以前面提到的mod_php5模組為例。首先我們需要在Apache的設定檔httpd.conf中加入一行:

LoadModule php5_module modules/mod_php5.so

這裡我們使用了LoadModule指令,而這個指令的第一個參數是模組的名稱,名稱可以在模組實作的來源碼中找到。第二個選項是該模組所處的路徑。如果需要在伺服器執行時間載入模組,可以透過發送訊號HUP或AP_SIG_GRACEFUL給伺服器,一旦接受到該訊號,Apache將重新裝載模組,而不需要重新啟動伺服器。 


該運作模式是我們先前在windows環境下使用apache伺服器經常使用的,而在模組化(DLL)中,PHP是與Web伺服器一起啟動並運行的。 (它是apache在CGI的基礎上進行的一種擴展,加快PHP的運作效率)。


五、ISAPI模式 #

ISAPI(Internet Server Application Program Interface)是微软提供的一套面向Internet服务的API接口,一个ISAPI的DLL,可以在被用户请求激活后长驻内存,等待用户的另一个请求,还可以在一个DLL里设置多个用户请求处理函数,此外,ISAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显著高于CGI。(由于微软的排他性,只能运行于windows环境) 

PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。

以上是php有幾種運行模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
酸與基本數據庫:差異和何時使用。酸與基本數據庫:差異和何時使用。Mar 26, 2025 pm 04:19 PM

本文比較了酸和基本數據庫模型,詳細介紹了它們的特徵和適當的用例。酸優先確定數據完整性和一致性,適合財務和電子商務應用程序,而基礎則側重於可用性和

PHP安全文件上傳:防止與文件相關的漏洞。PHP安全文件上傳:防止與文件相關的漏洞。Mar 26, 2025 pm 04:18 PM

本文討論了確保PHP文件上傳的確保,以防止諸如代碼注入之類的漏洞。它專注於文件類型驗證,安全存儲和錯誤處理以增強應用程序安全性。

PHP輸入驗證:最佳實踐。PHP輸入驗證:最佳實踐。Mar 26, 2025 pm 04:17 PM

文章討論了PHP輸入驗證以增強安全性的最佳實踐,重點是使用內置功能,白名單方法和服務器端驗證等技術。

PHP API率限制:實施策略。PHP API率限制:實施策略。Mar 26, 2025 pm 04:16 PM

本文討論了在PHP中實施API速率限制的策略,包括諸如令牌桶和漏水桶等算法,以及使用Symfony/Rate-limimiter之類的庫。它還涵蓋監視,動態調整速率限制和手

php密碼哈希:password_hash和password_verify。php密碼哈希:password_hash和password_verify。Mar 26, 2025 pm 04:15 PM

本文討論了使用password_hash和pyspasswify在PHP中使用密碼的好處。主要論點是,這些功能通過自動鹽,強大的哈希算法和SECH來增強密碼保護

OWASP前10 php:描述並減輕常見漏洞。OWASP前10 php:描述並減輕常見漏洞。Mar 26, 2025 pm 04:13 PM

本文討論了OWASP在PHP和緩解策略中的十大漏洞。關鍵問題包括注射,驗證損壞和XSS,並提供用於監視和保護PHP應用程序的推薦工具。

PHP XSS預防:如何預防XSS。PHP XSS預防:如何預防XSS。Mar 26, 2025 pm 04:12 PM

本文討論了防止PHP中XSS攻擊的策略,專注於輸入消毒,輸出編碼以及使用安全增強的庫和框架。

PHP接口與抽像類:何時使用。PHP接口與抽像類:何時使用。Mar 26, 2025 pm 04:11 PM

本文討論了PHP中接口和抽像類的使用,重點是何時使用。界面定義了無實施的合同,適用於無關類和多重繼承。摘要類提供常見功能

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版