PHP運(yùn)行模式主要有四種
1? cgi
2 fast-cgi
3 cli 命令行
4 web模塊模式
CGI模式
CGI(Common Gateway Interface),公共網(wǎng)關(guān)接口姿锭,它是Web服務(wù)器與外部應(yīng)用程序(CGI程序)之間傳遞信息的接口標(biāo)準(zhǔn)。
web服務(wù)器會(huì)根據(jù)請(qǐng)求的內(nèi)容食拜,fork一個(gè)子進(jìn)程啟動(dòng)CGI程序,這里就是指PHP的解析器副编,PHP解析器程序啟動(dòng)后负甸,它就會(huì)解析php.ini文件,初始化執(zhí)行環(huán)境痹届,然后解析動(dòng)態(tài)腳本呻待,再把處理完的數(shù)據(jù)返回給web服務(wù)器,最后web服務(wù)器把內(nèi)容發(fā)送給用戶(hù)队腐,剛才fork的進(jìn)程也隨之退出蚕捉。當(dāng)下次再有php任務(wù)請(qǐng)求時(shí),再重復(fù)之前的操作柴淘。
優(yōu)點(diǎn):
把web server和具體的程序處理分開(kāi)迫淹,結(jié)構(gòu)清晰
缺點(diǎn):每次處理請(qǐng)求都會(huì)重啟cgi程序(PHP解析器),cgi程序需要解析php.ini等初始化工作为严,造成效率低下敛熬,服務(wù)器負(fù)擔(dān)加重
FastCGI模式
FastCGI就像是一個(gè)常駐(long-live)型的CGI程序,它可以一直運(yùn)行著第股。其主要行為是將CGI解釋器進(jìn)程保持在內(nèi)存中并因此獲得高效的性能应民。當(dāng)客戶(hù)端請(qǐng)求Web服務(wù)器上的動(dòng)態(tài)腳本時(shí),Web服務(wù)器會(huì)將動(dòng)態(tài)腳本通過(guò)TCP協(xié)議交給FastCGI主進(jìn)程,F(xiàn)astCGI主進(jìn)程根據(jù)情況诲锹,安排一個(gè)空閑的子進(jìn)程來(lái)解析動(dòng)態(tài)腳本繁仁,處理完成后將結(jié)果返回給Web服務(wù)器,Web服務(wù)器再將結(jié)果返回給客戶(hù)端归园。該客戶(hù)端請(qǐng)求處理完畢后黄虱,F(xiàn)astCGI子進(jìn)程并不會(huì)隨之關(guān)閉,而是繼續(xù)等待主進(jìn)程安排工作任務(wù)庸诱。
工作原理:
(1)Web Server啟動(dòng)時(shí)載入FastCGI進(jìn)程管理器(PHP的FastCGI進(jìn)程管理器是PHP-FPM)
(2)FastCGI進(jìn)程管理器自身初始化悬钳,啟動(dòng)多個(gè)CGI解釋器進(jìn)程 (在任務(wù)管理器中可見(jiàn)多個(gè)php-cgi.exe)并等待來(lái)自Web Server的連接。
(3)當(dāng)客戶(hù)端請(qǐng)求到達(dá)Web Server時(shí)偶翅,F(xiàn)astCGI進(jìn)程管理器選擇并連接到一個(gè)CGI解釋器。Web server將CGI環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送到FastCGI子進(jìn)程php-cgi碉渡。
(4)FastCGI子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回Web Server聚谁。當(dāng)FastCGI子進(jìn)程關(guān)閉連接時(shí),請(qǐng)求便告處理完成滞诺。FastCGI子進(jìn)程接著等待并處理來(lái)自FastCGI進(jìn)程管理器(運(yùn)行在 WebServer中)的下一個(gè)連接形导。在正常的CGI模式中,php-cgi.exe在此便退出了习霹。
優(yōu)點(diǎn):
(1)從穩(wěn)定性上看, fastcgi是以獨(dú)立的進(jìn)程池運(yùn)行來(lái)cgi,單獨(dú)一個(gè)進(jìn)程死掉,系統(tǒng)可以很輕易的丟棄,然后重新分 配新的進(jìn)程來(lái)運(yùn)行邏輯朵耕。
(2)從安全性上看,Fastcgi支持分布式運(yùn)算。FastCGI程序也可以和Web服務(wù)器分別部署在不同的主機(jī)上淋叶,它還可以接受來(lái)自其他Web服務(wù)器的請(qǐng)求阎曹。也就是說(shuō)fastcgi和宿主的server完全獨(dú)立, fastcgi宕掉不會(huì)影響到server。
(3)從性能上看, fastcgi把動(dòng)態(tài)邏輯的處理從server中分離出來(lái), 大負(fù)荷的IO處理留給宿主server, 這樣宿主server可以一心一意處理IO煞檩。
CLI模式
CLI(Command Line Interface)即命令行運(yùn)行模式处嫌,如在終端輸入php a.php運(yùn)行php文件或者直接輸入 php -r “print_r(get_defined_constants());” 執(zhí)行php代碼。
web模塊模式
Web服務(wù)器內(nèi)置模塊斟湃,如apache的mod_ php模塊熏迹,微軟iis的ISAPI,nginx的php-fpm凝赛,將php解釋器做成模塊加載到服務(wù)器中注暗。這樣,隨著服務(wù)器的啟動(dòng)墓猎,PHP解釋器模塊也會(huì)隨之啟動(dòng)捆昏。Apache的模塊可以在運(yùn)行的時(shí)候動(dòng)態(tài)裝載,這意味著對(duì)服務(wù)器可以進(jìn)行功能擴(kuò)展而不需要重新對(duì)源代碼進(jìn)行編譯毙沾,甚至根本不需要停止服務(wù)器屡立。我們所需要做的僅僅是給服務(wù)器發(fā)送信號(hào)HUP或者AP_SIG_GRACEFUL通知服務(wù)器重新載入模塊。但是在動(dòng)態(tài)加載之前,我們需要將模塊編譯成為動(dòng)態(tài)鏈接庫(kù)膨俐。此時(shí)的動(dòng)態(tài)加載就是加載動(dòng)態(tài)鏈接庫(kù)勇皇。 Apache中對(duì)動(dòng)態(tài)鏈接庫(kù)的處理是通過(guò)模塊mod_so來(lái)完成的,因此mod_so模塊不能被動(dòng)態(tài)加載焚刺,它只能被靜態(tài)編譯進(jìn)Apache的核心敛摘,這意味著它是隨著Apache一起啟動(dòng)的。
缺點(diǎn):mod_php 這種嵌入的方式最大的弊端就是內(nèi)存占用大乳愉,不論是否用到PHP解釋器都會(huì)將其加載到內(nèi)存中兄淫。
————————————————
https://blog.csdn.net/IT_10/article/details/95031491?轉(zhuǎn)自