新聞中心
本教程操作環(huán)境:windows10系統(tǒng)、php7.1版、DELL G3電腦

簡(jiǎn)單來說 CGI、 FastCGI只是一個(gè)協(xié)議而已, php-cgi 是實(shí)現(xiàn)cgi的程序, php-fpm是管理php-cgi的一個(gè)管理器而已。
CGI全稱是“公共網(wǎng)關(guān)接口”(Common Gateway Interface),HTTP服務(wù)器與你的或其它機(jī)器上的程序進(jìn)行“交談”的一種工具,其程序須運(yùn)行在網(wǎng)絡(luò)服務(wù)器上。
是一種重要的互聯(lián)網(wǎng)技術(shù),可以讓一個(gè)客戶端,從網(wǎng)頁瀏覽器向執(zhí)行在網(wǎng)絡(luò)服務(wù)器上的程序請(qǐng)求數(shù)據(jù)。
CGI 描述了服務(wù)器和請(qǐng)求處理程序之間傳輸數(shù)據(jù)的一種標(biāo)準(zhǔn)。
CGI是干嘛的?CGI是為了保證web server傳遞過來的數(shù)據(jù)是標(biāo)準(zhǔn)格式的,方便CGI 程序的編寫者。
web server(比如說nginx)只是內(nèi)容的分發(fā)者。比如,如果請(qǐng)求/index.html,那么web server會(huì)去文件系統(tǒng)中找到這個(gè)文件,發(fā)送給瀏覽器,這里分發(fā)的是靜態(tài)數(shù)據(jù)。好了,如果現(xiàn)在請(qǐng)求的是/index.php,根據(jù)配置文件,nginx知道這個(gè)不是靜態(tài)文件,需要去找PHP解析器來處理,那么他會(huì)把這個(gè)請(qǐng)求簡(jiǎn)單處理后交給PHP解析器。Nginx會(huì)傳哪些數(shù)據(jù)給PHP解析器呢?url要有吧,查詢字符串也得有吧,POST數(shù)據(jù)也要有,HTTP header不能少吧,好的,CGI 就是規(guī)定要傳哪些數(shù)據(jù)、以什么樣的格式傳遞給后方處理這個(gè)請(qǐng)求的協(xié)議。仔細(xì)想想,你在PHP代碼中使用的用戶數(shù)據(jù)從哪里來的。
當(dāng)web server收到/index.php這個(gè)請(qǐng)求后,會(huì)啟動(dòng)對(duì)應(yīng)的CGI 程序,這里就是PHP的解析器。接下來PHP解析器會(huì)解析php.ini文件,初始化執(zhí)行環(huán)境,然后處理請(qǐng)求,再以規(guī)定CGI規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程。web server再把結(jié)果返回給瀏覽器。
好了,CGI是個(gè)協(xié)議,跟進(jìn)程什么的沒關(guān)系。那fastcgi又是什么呢?Fastcgi是用來提高CGI程序性能的。
FastCGI是從CGI發(fā)展改進(jìn)而來的。傳統(tǒng)CGI接口方式的主要缺點(diǎn)是性能很差,因?yàn)槊看蜨TTP服務(wù)器遇到動(dòng)態(tài)程序時(shí)都需要重新啟動(dòng)腳本解析器來執(zhí)行解析,然后結(jié)果被返回給HTTP服務(wù)器。
提高性能,那么CGI 程序的性能問題在哪呢?"PHP解析器會(huì)解析php.ini文件,初始化執(zhí)行環(huán)境",就是這里了。標(biāo)準(zhǔn)的 CGI 對(duì)每個(gè)請(qǐng)求都會(huì)執(zhí)行這些步驟(不閑累?。?dòng)進(jìn)程很累的說!),所以處理每個(gè)時(shí)間的時(shí)間會(huì)比較長(zhǎng)。這明顯不合理嘛!那么Fastcgi是怎么做的呢?首先,F(xiàn)astcgi會(huì)先啟一個(gè)master,解析配置文件,初始化執(zhí)行環(huán)境,然后再啟動(dòng)多個(gè)worker。當(dāng)請(qǐng)求過來時(shí),master會(huì)傳遞給一個(gè)worker,然后立即可以接受下一個(gè)請(qǐng)求。這樣就避免了重復(fù)的勞動(dòng),效率自然是高。而且當(dāng)worker不夠用時(shí),master可以根據(jù)配置預(yù)先啟動(dòng)幾個(gè)worker等著;當(dāng)然空閑worker太多時(shí),也會(huì)停掉一些,這樣就提高了性能,也節(jié)約了資源。這就是fastcgi的對(duì)進(jìn)程的管理。
那PHP-FPM又是什么呢?是一個(gè)實(shí)現(xiàn)了Fastcgi 的程序,被PHP官方收了。
大家都知道,PHP的解釋器是php-cgi。php-cgi只是個(gè)CGI 程序,他自己本身只能解析請(qǐng)求,返回結(jié)果,不會(huì)進(jìn)程管理(皇上,臣妾真的做不到?。?所以就出現(xiàn)了一些能夠調(diào)度php-cgi進(jìn)程的程序,比如說由lighthttpd分離出來的spawn-fcgi。好了PHP-FPM也是這么個(gè)東東,在長(zhǎng)時(shí)間的發(fā)展后,逐漸得到了大家的認(rèn)可,也越來越流行。
PHP-CGI是解釋PHP腳本的程序而已。
PHP-FPM是一個(gè)FastCGI 管理器
CGI 模式運(yùn)行原理
當(dāng) Nginx 收到瀏覽器 /index.php 這個(gè)請(qǐng)求后,首先會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)實(shí)現(xiàn)了 CGI 協(xié)議的進(jìn)程,這里就是 php-cgi(PHP 解析器)。接下來 php-cgi 會(huì)解析 php.ini 文件,初始化執(zhí)行環(huán)境,然后處理請(qǐng)求,再以 CGI 規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程。最后,Nginx 再把結(jié)果返回給瀏覽器。整個(gè)流程就是一個(gè) Fork-And-Execute 模式。當(dāng)用戶請(qǐng)求數(shù)量非常多時(shí),會(huì)大量擠占系統(tǒng)的資源如內(nèi)存、CPU時(shí)間等,造成效能低下。所以在用 CGI 方式的服務(wù)器下,有多少個(gè)連接請(qǐng)求就會(huì)有多少個(gè) CGI 子進(jìn)程,子進(jìn)程反復(fù)加載是 CGI 性能低下的主要原因。
本文標(biāo)題:php中cgi是什么意思
當(dāng)前路徑:http://m.fisionsoft.com.cn/article/dhiphgc.html


咨詢
建站咨詢
