溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP-FPM的原理和用法

發(fā)布時(shí)間:2021-07-12 10:17:29 來源:億速云 閱讀:212 作者:chen 欄目:編程語言

這篇文章主要講解了“PHP-FPM的原理和用法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“PHP-FPM的原理和用法”吧!

面試官:說說你對(duì)PHP-FPM的理解

1. CGI(Common Gateway Interface,CGI)通用網(wǎng)關(guān)接口, 是Web 服務(wù)器運(yùn)行時(shí)外部程序的規(guī)范,按CGI 編寫的程序可以擴(kuò)展服務(wù)器功能。CGI 應(yīng)用程序能與瀏覽器進(jìn)行交互,還可通過數(shù)據(jù)API與數(shù)據(jù)庫服務(wù)器等外部數(shù)據(jù)源進(jìn)行通信,從數(shù)據(jù)庫服務(wù)器中獲取數(shù)據(jù)。格式化為HTML文檔后,發(fā)送給瀏覽器,也可以將從瀏覽器獲得的數(shù)據(jù)放到數(shù)據(jù)庫中。幾乎所有服務(wù)器都支持CGI,可用任何語言編寫CGI,包括流行的C、C ++、Java、VB 和Delphi 等。所以說CGI是一個(gè)協(xié)議,不是進(jìn)程。CGI的存在,可以使用戶通過瀏覽器來訪問執(zhí)行在服務(wù)器上的動(dòng)態(tài)程序;CGI是Web服務(wù)器與CGI程序間傳輸數(shù)據(jù)的標(biāo)準(zhǔn);

服務(wù)器端 CGI 程序接收信息有三種途徑:環(huán)境變量、命令行和標(biāo)準(zhǔn)輸入。

命令行:<form>表單的Method=GET,向CGI 傳遞表單編碼信息是通過命令方式來進(jìn)行的。

標(biāo)準(zhǔn)輸入:<form>表單的Method=POST,向CGI 傳遞表單編碼信息是通過標(biāo)準(zhǔn)輸入方式來進(jìn)行的。

環(huán)境變量:表單編碼信息是通過環(huán)境變量QUERY_STRING 來傳遞。

瀏覽器傳遞數(shù)據(jù)方式:

POST:發(fā)送數(shù)據(jù)大小不受限制,環(huán)境變量CONTENT_LENGTH 存放這發(fā)送數(shù)據(jù)的長度,CGI程序檢查環(huán)境變量REQUEST_METHOD 確定是否采用了POST,決定是否使用標(biāo)準(zhǔn)輸入

GET:發(fā)送數(shù)據(jù)小于1024字節(jié)可使用

URL+?:屬于GET方式

PHP-FPM的原理和用法

CGI工作機(jī)制

PHP-FPM的原理和用法

傳統(tǒng)的CGI程序執(zhí)行過程

2. FastCGI(Fast Common Gateway Interface)快速通用網(wǎng)關(guān)接口,是CGI的優(yōu)化升級(jí)。

FastCGI發(fā)展

傳統(tǒng)CGI接口方式主要的缺點(diǎn)是性能差,因?yàn)槊看蜨TTP服務(wù)器遇到動(dòng)態(tài)程序時(shí)需要重新啟動(dòng)腳本解析器(php-cgi)來執(zhí)行解析,然后結(jié)果返回給HTTP服務(wù)器。那么在處理高并發(fā)時(shí),幾乎是不可用的。

FastCGI接口方式采用C/S結(jié)構(gòu),可以將HTTP服務(wù)器和腳本解析服務(wù)器分開,同時(shí)在腳本解析服務(wù)器上啟動(dòng)一個(gè)或者多個(gè)腳本解析守護(hù)進(jìn)程。當(dāng)HTTP服務(wù)器每次遇到動(dòng)態(tài)程序時(shí),可以將其直接交付給FastCGI進(jìn)程來執(zhí)行,然后將得到的結(jié)果返回給瀏覽器。這種方式可以讓HTTP服務(wù)器專一地處理靜態(tài)請(qǐng)求或者將動(dòng)態(tài)腳本服務(wù)器的結(jié)果返回給客戶端,這在很大程度上提高了整個(gè)應(yīng)用系統(tǒng)的性能。

FastCGI 與傳統(tǒng) CGI 模式的區(qū)別之一則是 Web 服務(wù)器不是直接執(zhí)行 CGI 程序了,而是通過 socket 與 FastCGI 響應(yīng)器(FastCGI 進(jìn)程管理器)進(jìn)行交互,Web 服務(wù)器需要將 CGI 接口數(shù)據(jù)封裝在遵循 FastCGI 協(xié)議包中發(fā)送給 FastCGI 響應(yīng)器程序。正是由于 FastCGI 進(jìn)程管理器是基于 socket 通信的,所以也是分布式的,Web服務(wù)器和CGI響應(yīng)器服務(wù)器分開部署。

PHP-FPM的原理和用法

基于FastCGI進(jìn)程管理器程序執(zhí)行過程

3. PHP-CGI是PHP解釋器,它是個(gè)CGI程序,本身只能解析請(qǐng)求,不能管理進(jìn)程。

4. PHP-FPM(FastCGI Process Manager:FastCGI進(jìn)程管理器)是用來調(diào)度管理PHP-FastCGI進(jìn)程的程序,在PHP5.3.3之前是php內(nèi)核的一個(gè)補(bǔ)丁包,在后來的版本中php內(nèi)核集成了php-fpm。

二、Nginx+FastCGI的工作過程

Nginx不支持對(duì)外部程序的直接調(diào)用或者解析,所有的外部程序(包括PHP)必須通過FastCGI接口來調(diào)用。FastCGI接口在Linux下是socket,(這個(gè)socket可以是文件socket,也可以是ip socket)。

為了調(diào)用CGI程序,還需要一個(gè)FastCGI的wrapper(wrapper可以理解為用于啟動(dòng)另一個(gè)程序的程序),這個(gè)wrapper綁定在某個(gè)固定socket上,如端口或者文件socket。當(dāng)Nginx將CGI請(qǐng)求發(fā)送給這個(gè)socket的時(shí)候,通過FastCGI接口,wrapper接收到請(qǐng)求,然后派生出一個(gè)新的線程,這個(gè)線程調(diào)用解釋器或者外部程序處理腳本并讀取返回?cái)?shù)據(jù);接著,wrapper再將返回的數(shù)據(jù)通過FastCGI接口,沿著固定的socket傳遞給Nginx;最后,Nginx將返回的數(shù)據(jù)發(fā)送給客戶端,這就是Nginx+FastCGI的整個(gè)工作過程。

PHP-FPM的原理和用法

三、PHP-FPM對(duì)進(jìn)程的管理

Fastcgi是一個(gè)協(xié)議,不是進(jìn)程。PHP-FPM實(shí)現(xiàn)了這個(gè)協(xié)議,是對(duì)Fastcgi程序(php-cgi)的進(jìn)程管理器。

首先,先啟一個(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é)約了資源。這就是php-fpm的對(duì)進(jìn)程的管理。php-fpm的管理對(duì)象是php-cgi。

四、PHP-FPM實(shí)現(xiàn)平滑重啟

1. WorkerMan平滑重啟

WorkerMan分為主進(jìn)程和子進(jìn)程,主進(jìn)程負(fù)責(zé)監(jiān)控子進(jìn)程,子進(jìn)程負(fù)責(zé)接收客戶端的連接和連接上發(fā)來的請(qǐng)求數(shù)據(jù),做相應(yīng)的處理并返回?cái)?shù)據(jù)給客戶端。當(dāng)業(yè)務(wù)代碼更新時(shí),其實(shí)我們只要更新子進(jìn)程,便可以達(dá)到更新代碼的目的。

當(dāng)WorkerMan主進(jìn)程收到平滑重啟信號(hào)時(shí),主進(jìn)程會(huì)向其中一個(gè)子進(jìn)程發(fā)送安全退出(讓對(duì)應(yīng)進(jìn)程處理完畢當(dāng)前請(qǐng)求后才退出)信號(hào),當(dāng)這個(gè)進(jìn)程退出后,主進(jìn)程會(huì)重新創(chuàng)建一個(gè)新的子進(jìn)程(這個(gè)子進(jìn)程載入了新的PHP代碼),然后主進(jìn)程再次向另外一個(gè)舊的進(jìn)程發(fā)送停止命令,這樣一個(gè)進(jìn)程一個(gè)進(jìn)程的重啟,直到所有舊的進(jìn)程全部被置換為止。

PHP-FPM的原理和用法

2. Nginx平滑重啟

Nginx的進(jìn)程分為master主進(jìn)程和work工作進(jìn)程,master進(jìn)程主要管理事件信號(hào)接受和分發(fā),所有的請(qǐng)求處理都由work進(jìn)程處理并返回結(jié)果,Nginx的平滑重啟或重載配置文件等升級(jí),首先是向master發(fā)送重啟或重載配置文件信號(hào),然后master告訴所有的work進(jìn)程不再接受新的請(qǐng)求,然后master另起新的work進(jìn)程,最后告訴舊的work進(jìn)程可以光榮退出了。

3. PHP-FPM平滑重啟

php-fpm對(duì)此的處理機(jī)制是新的worker用新的配置,已經(jīng)存在的worker處理完手上的活就可以歇著了,通過這種機(jī)制來平滑過度。

五、PHP-FPM詳解

PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 進(jìn)程管理器,用于管理PHP 進(jìn)程池的軟件,用于接受web服務(wù)器的請(qǐng)求。

PHP-FPM提供了更好的PHP進(jìn)程管理方式,可以有效控制內(nèi)存和進(jìn)程、可以平滑重載PHP配置。

1. 為什么會(huì)出現(xiàn)php-fpm

fpm的出現(xiàn)是因?yàn)閜hp-fastcgi出現(xiàn),為了很好的管理php-fastcgi而實(shí)現(xiàn)的一個(gè)程序。

2. 什么是php-fastcgi

php-fastcgi 只是一個(gè)cgi程序,只會(huì)解析php請(qǐng)求,并且返回結(jié)果,不會(huì)管理(因此才出現(xiàn)的php-fpm)。

3. 為什么不叫php-cgi

其實(shí)在php-fastcgi出現(xiàn)之前是有一個(gè)php-cgi存在的,只是它的執(zhí)行效率低下,因此被php-fastcgi取代。

4. fastcgi和cgi有什么區(qū)別

這區(qū)別就大了,當(dāng)一個(gè)服務(wù)web-server(nginx)分發(fā)過來請(qǐng)求的時(shí)候,通過匹配后綴知道該請(qǐng)求是個(gè)動(dòng)態(tài)的php請(qǐng)求,會(huì)把這個(gè)請(qǐng)求轉(zhuǎn)給php。

在cgi的年代,思想比較保守,總是一個(gè)請(qǐng)求過來后,去讀取php.ini里的基礎(chǔ)配置信息,初始化執(zhí)行環(huán)境,每次都要不停的去創(chuàng)建一個(gè)進(jìn)程,讀取配置,初始化環(huán)境,返回?cái)?shù)據(jù),退出進(jìn)程,久而久之,啟動(dòng)進(jìn)程的工作變的乏味無趣特別累。

當(dāng)php來到了5的時(shí)代,大家對(duì)這種工作方式特別反感,想偷懶的人就拼命的想,我可不可以讓cgi一次啟動(dòng)一個(gè)主進(jìn)程(master),讓他只讀取一次配置,然后在啟動(dòng)多個(gè)工作進(jìn)程(worker),當(dāng)一個(gè)請(qǐng)求來的時(shí)候,通過master傳遞給worker這樣就可以避免重復(fù)勞動(dòng)了。于是就產(chǎn)生了fastcgi。

5. fastcgi這么好,啟動(dòng)的worker用完怎么辦

當(dāng)worker不夠的時(shí)候,master會(huì)通過配置里的信息,動(dòng)態(tài)啟動(dòng)worker,等空閑的時(shí)候可以收回worker

6. 到現(xiàn)在還是沒明白php-fpm 是個(gè)什么東西?

就是來管理啟動(dòng)一個(gè)master進(jìn)程和多個(gè)worker進(jìn)程的程序。

PHP-FPM 會(huì)創(chuàng)建一個(gè)主進(jìn)程,控制何時(shí)以及如何將HTTP請(qǐng)求轉(zhuǎn)發(fā)給一個(gè)或多個(gè)子進(jìn)程處理。PHP-FPM主進(jìn)程還控制著什么時(shí)候創(chuàng)建(處理Web應(yīng)用更多的流量)和銷毀(子進(jìn)程運(yùn)行時(shí)間太久或不再需要了)PHP子進(jìn)程。PHP-FPM進(jìn)程池中的每個(gè)進(jìn)程存在的時(shí)間都比單個(gè)HTTP請(qǐng)求長,可以處理10、50、100、500或更多的HTTP請(qǐng)求。

六、PHP-FPM安裝

PHP在 5.3.3 之后已經(jīng)把php-fpm并入到php的核心代碼中了。所以php-fpm不需要單獨(dú)的下載安裝。
要想php支持php-fpm,只需要在編譯php源碼的時(shí)候帶上 --enable-fpm 就可以了。

七、PHP-FPM配置

在Centos中,PHP-FPM 的主配置文件是 /etc/php7/php-fpm.conf。

指定一段時(shí)間內(nèi)有指定個(gè)子進(jìn)程失效了,PHP-FPM重啟:

PHP-FPM的原理和用法

PHP-FPM的原理和用法

PHP-FPM的原理和用法

感謝各位的閱讀,以上就是“PHP-FPM的原理和用法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)PHP-FPM的原理和用法這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI