讲php fpm的书,细说PHP-fpm
最近在研究PHP的源碼,有時(shí)候會延伸到很多東西。這里就專程找了下php-fpm的內(nèi)容學(xué)習(xí)下。
是什么?
在理解php-fpm之前,我們要先搞清楚幾個關(guān)鍵詞以及他們之間的關(guān)系:CGI
FastCGI
php-fpm
php-cgi.
CGI:(Common Gateway Interface),即通用網(wǎng)關(guān)接口的意思,描述的是服務(wù)器和請求處理程序之間傳輸數(shù)據(jù)的一種標(biāo)準(zhǔn)。 所以,CGI是一種協(xié)議。CGI可用于任何語言,只要該語言具有標(biāo)準(zhǔn)的輸出、輸入以及環(huán)境變量。如perl、php等語言。 以nginx和php為例,我們可以理解為,這是php在與nginx服務(wù)器之間交互時(shí),對傳輸數(shù)據(jù)的一種約定。
在《HTTP權(quán)威指南》書中,是這么描述的
CGI是一個標(biāo)準(zhǔn)接口集,Web 服務(wù)器可以用它來裝載程序以響應(yīng)對特定 URL 的 HTTP 請求,并收集程序的輸出數(shù)據(jù),將其放在 HTTP 響應(yīng)中回送。
那CGI的原理是什么呢
當(dāng)需要請求使用網(wǎng)關(guān)的資源時(shí),服務(wù)器會請輔助應(yīng)用程序來處理請求(比如nginx會請php程序來處理請求)。 服務(wù)器會將輔助應(yīng)用程序的數(shù)據(jù)傳送給網(wǎng)關(guān)。然后網(wǎng)關(guān)會向服務(wù)器返回一條響應(yīng)或者響應(yīng)數(shù)據(jù),服務(wù)器再將響應(yīng)或響應(yīng)數(shù)據(jù)轉(zhuǎn)發(fā)給客戶端。
由此我們可以清楚兩點(diǎn):
服務(wù)器和網(wǎng)關(guān)是相互獨(dú)立的應(yīng)用程序
服務(wù)器是應(yīng)用程序和網(wǎng)關(guān)之間的一座橋梁
具體原理如圖所示:
image.png
由此,我們可知CGI有一個致命的弱點(diǎn),即應(yīng)用程序的每次請求,都要引發(fā)一個全新的進(jìn)程。所以,服務(wù)器和網(wǎng)關(guān)之間的分離會造成性能的 耗費(fèi),會限制使用CGI的服務(wù)器的性能,并且會加重服務(wù)端機(jī)器資源的負(fù)擔(dān)。
好啦,重角要登場了。后來為了解決這個問題,出現(xiàn)了FastCGI,也就是快速的CGI。 接下來,我們再詳細(xì)的了解下FastCGI。
FastCGI:(Fast Common Gateway Interface),即快速通用網(wǎng)關(guān)接口,是一種讓交互程序與Web服務(wù)器通信的協(xié)議。它是CGI的增強(qiáng)版本
FastCGI致力于減少網(wǎng)頁服務(wù)器與CGI程序之間互動的開銷,從而使服務(wù)器可以同時(shí)處理更多的網(wǎng)頁請求。
以上來自維基百科,我們可以由此了解到,FastCGI,同CGI一樣,也是一種協(xié)議,只不過它是CGI的增強(qiáng)版本。
那FastCGI是如何增強(qiáng)性能的呢?
FastCGI接口模擬了CGI,但FastCGI是作為持久守護(hù)進(jìn)程運(yùn)行的,消除了為每個請求建立或拆除新進(jìn)程所帶來的性能損耗。也就是允許,一個進(jìn)程內(nèi)可以處理多個請求。 也就說CGI解釋器保持在內(nèi)存中,并接受了FastCGI進(jìn)程管理和調(diào)度,所以它可以提供更好的性能,可擴(kuò)展性,故障切換等特點(diǎn)
FastCGI的特點(diǎn)
FastCGI與語言無關(guān)
FastCGI應(yīng)用在進(jìn)程中,獨(dú)立于核心網(wǎng)絡(luò)服務(wù)器,提供了一個比API環(huán)境更安全的環(huán)境。 APIs的代碼和web服務(wù)器的應(yīng)用的核心是 緊緊關(guān)聯(lián)的。這也就意味著在API應(yīng)用程序的錯誤可能會損壞其它應(yīng)用程序或核心服務(wù)器。惡意API應(yīng)用程序代碼甚至可以竊取另一個應(yīng)用程序或核心服務(wù)器密鑰。
FastCGI技術(shù)摸錢支持PHP,C/C++, Java language, Perl, Tcl, Python, SmallTalk, Ruby etc.. 它在Apache, ISS, Lighttpd和其他流行的 服務(wù)器中的相關(guān)模塊都是可以使用的。FastCGI不依賴于任何服務(wù)器體系結(jié)構(gòu),所以即使服務(wù)器在技術(shù)上改變了,FastCGI還是穩(wěn)定的
FastCGI的工作原理
Web Server 啟動時(shí)載入FastCGI進(jìn)程管理器 (IIS ISAPI 或Apache Module)
FastCGI進(jìn)程管理器首先初始化自己,啟動一批CGI解釋器進(jìn)程(可見多個php-cgi),然后等待來自Web Server的連接。
當(dāng)Web Server中的一個客戶端請求達(dá)到時(shí), FastCGI進(jìn)程管理器會選擇并連接一個CGI解釋器。Web server的CGI環(huán)境變量和標(biāo)準(zhǔn)輸入會被送達(dá)FastCGI進(jìn)程的php-cgi。
FastCGI子進(jìn)程從同一連接完成返還給Web Server的標(biāo)準(zhǔn)輸出和錯誤信息。當(dāng)請求進(jìn)程完成后,FastCGI進(jìn)程會關(guān)閉此連接。FastCGI會等待并出來來自FastCGI進(jìn)程管理器(運(yùn)行在Web Server中的)的下一個連接。 在CGI模式,php-cgi然后會退出。
FastCGI的不足
因?yàn)槭嵌噙M(jìn)程,所以比CGI多線程消耗更多的服務(wù)器內(nèi)存,PHP-CGI解釋器每進(jìn)程消耗7至25兆內(nèi)存,將這個數(shù)字乘以50或100就是很大的內(nèi)存數(shù)。 Nginx 0.8.46+PHP 5.2.14(FastCGI)服務(wù)器在3萬并發(fā)連接下,開啟的10個Nginx進(jìn)程消耗150M內(nèi)存(15M10=150M),開啟的64個php-cgi進(jìn)程消耗1280M內(nèi)存(20M64=1280M),加上系統(tǒng)自身消耗的內(nèi)存,總共消耗不到2GB內(nèi)存。 如果服務(wù)器內(nèi)存較小,完全可以只開啟25個php-cgi進(jìn)程,這樣php-cgi消耗的總內(nèi)存數(shù)才500M。
PHP-CGI: PHP-CGI是PHP自帶的FastCGI管理器。
PHP-CGI的不足
php-cgi變更php.ini配置后需重啟php-cgi才能讓新的php-ini生效,不可以平滑重啟
直接殺死php-cgi進(jìn)程,php就不能運(yùn)行了。(PHP-FPM和Spawn-FCGI就沒有這個問題,守護(hù)進(jìn)程會平滑從新生成新的子進(jìn)程。)
php-fpm
PHP-FPM是一個PHP FastCGI管理器,是只用于PHP的,可以在
PHP-FPM其實(shí)是PHP源代碼的一個補(bǔ)丁,旨在將FastCGI進(jìn)程管理整合進(jìn)PHP包中。必須將它patch到你的PHP源代碼中,在編譯安裝PHP后才可以使用。
現(xiàn)在我們可以在最新的PHP 5.3.2的源碼樹里下載得到直接整合了PHP-FPM的分支,據(jù)說下個版本會融合進(jìn)PHP的主分支去。相對Spawn-FCGI,PHP-FPM在CPU和內(nèi)存方面的控制都更勝一籌,而且前者很容易崩潰,必須用crontab進(jìn)行監(jiān)控,而PHP-FPM則沒有這種煩惱。 PHP5.3.3已經(jīng)集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP進(jìn)程管理方式,可以有效控制內(nèi)存和進(jìn)程、可以平滑重載PHP配置,比spawn-fcgi具有更多有點(diǎn),所以被PHP官方收錄了。在./configure的時(shí)候帶 –enable-fpm參數(shù)即可開啟PHP-FPM。
總結(jié)
以上是生活随笔為你收集整理的讲php fpm的书,细说PHP-fpm的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业级项目实战讲解!Java获取某个日期
- 下一篇: PHP闭包(Closure)初探(转载