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

php有幾種運行模式

Sep 25, 2019 am 11:54 AM
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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

See all articles