CGI,全稱為“Common Gateway Interface”,是指WEB服務(wù)器運(yùn)行外部程序或腳本的一種標(biāo)準(zhǔn)。
而PHP CGI進(jìn)程則是指運(yùn)行PHP動態(tài)腳本時的進(jìn)程,它由WEB服務(wù)器(如Apache、Nginx等)調(diào)用,以響應(yīng)客戶端的請求。PHP是一種服務(wù)器端腳本語言,CGI進(jìn)程是將PHP代碼轉(zhuǎn)換成可被機(jī)器執(zhí)行的指令集,并輸出結(jié)果給客戶端。
舉個例子,當(dāng)用戶在瀏覽器中訪問如下地址:http://example.com/index.php ,WEB服務(wù)器將會調(diào)用PHP CGI進(jìn)程,執(zhí)行index.php文件中的腳本,然后把執(zhí)行的結(jié)果返回給瀏覽器,用戶就能看到生成的網(wǎng)頁內(nèi)容。
在PHP的CGI進(jìn)程中,由于Web服務(wù)器處理速度相對較慢,因此PHP采取了進(jìn)程池的機(jī)制,即在服務(wù)器啟動時便創(chuàng)建多個CGI進(jìn)程,這些進(jìn)程被復(fù)用,以提高PHP腳本的執(zhí)行效率和響應(yīng)速度。
多進(jìn)程可以減少CGI進(jìn)程的請求等待時間,提高服務(wù)器的并發(fā)處理能力。但進(jìn)程數(shù)不宜過多,一般情況下進(jìn)程數(shù)量應(yīng)控制在20個以內(nèi),否則會引發(fā)服務(wù)器負(fù)載過高、CPU占用過高等問題。
//創(chuàng)建4個PHP-CGI進(jìn)程的命令
spawn-fcgi -a 127.0.0.1 -p 9000 -C 4 -f /usr/bin/php-cgi
其中,spawn-fcgi是Fastcgi的一部分工具,用于生成CGI進(jìn)程;-a參數(shù)指定監(jiān)聽地址,-p參數(shù)指定監(jiān)聽端口,-C參數(shù)指定并發(fā)數(shù),-f參數(shù)指定CGI程序路徑。
在使用php-fpm時,可以通過設(shè)置process_manager_start_servers、process_manager_min_spare_servers和process_manager_max_spare_servers等參數(shù)控制PHP CGI進(jìn)程池的大小。process_manager_start_servers指定啟動時進(jìn)程池的大小, process_manager_min_spare_servers和process_manager_max_spare_servers則指定進(jìn)程池中最小和最大空閑進(jìn)程數(shù)。
;php-fpm 配置文件:
process_manager_start_servers = 5
process_manager_min_spare_servers = 2
process_manager_max_spare_servers = 8
當(dāng)客戶端請求PHP腳本時, PHP-fpm會判斷現(xiàn)有的進(jìn)程是否符合要求(是否大于等于最小空閑進(jìn)程數(shù)和是否小于等于最大空閑進(jìn)程數(shù)),如符合則直接使用進(jìn)程池中的CGI進(jìn)程。如果不符合,則會創(chuàng)建新的CGI進(jìn)程,直至符合要求。
在PHP CGI進(jìn)程池的管理中,注意要根據(jù)服務(wù)器的硬件性能和負(fù)載情況來調(diào)整池子的大小。過大或過小都會對服務(wù)器造成負(fù)擔(dān),不利于PHP腳本的高效執(zhí)行。
我們需要注意的是,當(dāng)一個進(jìn)程運(yùn)行時間過長或者占用的內(nèi)存超過限制時,我們需要及時kill掉當(dāng)前進(jìn)程,同時Web服務(wù)器會自動重啟一個新的CGI進(jìn)程以代替被kill掉的進(jìn)程,確保服務(wù)器的正常運(yùn)行。
//殺掉CPU占用超過8%的PHP-CGI進(jìn)程
ps -ef | grep "php-cgi" | awk '$3>8 {print $2}' | xargs kill
在以上命令中,ps指用于查看系統(tǒng)進(jìn)程,grep指用于查找特定進(jìn)程,awk是Linux系統(tǒng)的文本處理工具,xargs則是從標(biāo)準(zhǔn)輸入中讀取數(shù)據(jù)并將其轉(zhuǎn)化為命令參數(shù)。當(dāng)進(jìn)程的CPU使用率超過了8%時,通過xargs啟動kill命令結(jié)束進(jìn)程。
在CGI進(jìn)程的管理過程中,我們需要時刻關(guān)注服務(wù)器的運(yùn)行狀態(tài),及時調(diào)整CGI進(jìn)程池的大小,使其能夠更好地適應(yīng)服務(wù)器的硬件能力和負(fù)載情況。