什么是php-fpm?下面本篇帶大家了解一下php-fpm,介紹一下優(yōu)化 php-fpm 時(shí)我們到底要優(yōu)化什么,希望對(duì)大家有所幫助!
PHP是無處不在的,可以說是互聯(lián)網(wǎng) Web 應(yīng)用上使用最廣泛的語言。
然而,它的高性能并不為人所知,尤其是在涉及到高并發(fā)系統(tǒng)時(shí)。這就是為什么對(duì)于這樣特殊的用例,正在被 Node (是的,我知道,它不是一種語言)、Go 和 Elixir 等語言接管。
也就是說,您可以做很多事情來改進(jìn)服務(wù)器上的 PHP 性能。本文主要關(guān)注 php-fpm
方面的內(nèi)容,如果您使用Nginx,這是在服務(wù)器上的默認(rèn)配置。
如果你知道 php-fpm
是什么,請(qǐng)直接跳到優(yōu)化部分。
什么是 php-fpm?
許多開發(fā)人員對(duì) DevOps 方面的知識(shí)不太感興趣,即使是那些對(duì)此感興趣的開發(fā)人員,也極少有人知道它的底層原理。有趣的是,當(dāng)瀏覽器發(fā)送一個(gè)請(qǐng)求到運(yùn)行 PHP 的服務(wù)器上時(shí),PHP 也不是最先進(jìn)行處理請(qǐng)求的服務(wù);而是,HTTP 服務(wù)器,Apache 和 Nginx 是其中最主要的兩個(gè)?!竪eb 服務(wù)器」決定如何與 PHP 進(jìn)行通信,然后傳遞請(qǐng)求的類型,數(shù)據(jù)和頭部信息到 PHP 進(jìn)程。
上圖是 PHP 項(xiàng)目的請(qǐng)求-響應(yīng)生命周期(圖片來源: ProinerTech)
在現(xiàn)代 PHP 應(yīng)用中,「find file」部分即為 index.php
文件,它是在服務(wù)器配置文件中配置的用于處理所有請(qǐng)求的代理。
如今,Web 服務(wù)器究竟如何連接 PHP 正在進(jìn)化,如果我們要深入研究所有細(xì)節(jié),這篇文章的長度將激增。但粗略來說, 在 Apache 作為 Web 服務(wù)器首選的時(shí)間段,PHP 是作為包含在服務(wù)器內(nèi)部的模塊。
所以每當(dāng)一個(gè)請(qǐng)求被接收,服務(wù)器將開啟一個(gè)新的進(jìn)程, 它將自動(dòng)包含 PHP 和執(zhí)行請(qǐng)求。這個(gè)方法被稱作mod_php
,“PHP作為一個(gè)模塊”的縮寫。這種方法有其局限性,而 Nginx 和 php-fpm
克服了它。
在php-fpm
中,管理 PHP 的責(zé)任在于服務(wù)器內(nèi)部的 PHP 程序。換言之, Web 服務(wù)器 (Nginx, 在本例中), 不在乎 PHP 在哪和怎樣運(yùn)行的,只要它知道如何發(fā)送和接收數(shù)據(jù)即可。如果需要,在這種情況下,您可以將PHP視為另一臺(tái)服務(wù)器,它管理傳入請(qǐng)求的某些子PHP進(jìn)程(因此,我們將請(qǐng)求送到服務(wù)器,該請(qǐng)求由服務(wù)器接收并傳遞到服務(wù)器 — —太瘋狂了!:-P)。
如果你用過Nginx
,你會(huì)看到這些代碼:
location ~ .php$ { try_files $uri =404; fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass unix:/run/php/php7.2-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
對(duì)于這一行:fastcgi_pass unix:/run/php/php7.2-fpm.sock;
,它告訴Nginx通過 php7.2-fpm.sock
的socket
與php進(jìn)程通信。因此,對(duì)于每個(gè)傳入的請(qǐng)求,Nginx都通過這個(gè)文件寫入數(shù)據(jù),在接收到輸出后,將其發(fā)送回瀏覽器。
我必須再次強(qiáng)調(diào),對(duì)于如何運(yùn)行這不是最完整或者最準(zhǔn)確的,但對(duì)于大多數(shù) DevOps 任務(wù)是完全準(zhǔn)確的。
除此之外,讓我們回顧一下到目前為止所學(xué)到的東西:
- PHP不會(huì)直接接收瀏覽器發(fā)送的請(qǐng)求。像 Nginx 這種 Web 服務(wù)器首先會(huì)攔截它。
- Web 服務(wù)器知道如何連接到PHP進(jìn)程,并將所有請(qǐng)求數(shù)據(jù)(粘貼所有內(nèi)容)傳遞到 PHP 上。
- PHP 完成其職責(zé)后,會(huì)將響應(yīng)發(fā)送回 Web 服務(wù)器,然后將其發(fā)送回客戶端(在大多數(shù)情況下為瀏覽器)。
流程圖如下:
PHP 和 Nginx 如何協(xié)同工作? (圖片來源:數(shù)據(jù)狗)
到目前為止都不錯(cuò), 那么關(guān)鍵問題來了:PHP-FPM到底是什么呢?
PHP 中的 FPM
代表 「快速進(jìn)程管理器」, 花式解釋就是說,在服務(wù)器上運(yùn)行的 PHP 并不是單個(gè)進(jìn)程,而是由這個(gè) FPM 進(jìn)程管理器派生、控制和終止的一些PHP 進(jìn)程。web服務(wù)器將請(qǐng)求傳遞給的就是這個(gè)進(jìn)程管理器。
PHP-FPM 本身就是一個(gè)完整的兔子洞,所以如果您愿意,可以隨意探索,但是對(duì)于我們的目的,這些解釋就足夠啦。 ?
為什么要優(yōu)化php-fpm?
一般在正常運(yùn)行的情況下,為什么要考慮優(yōu)化呢? 為什么不將事物保持原樣。
具有諷刺意味的是,一般我為大多數(shù)用例提供建議的話。 如果您的設(shè)置運(yùn)行良好,并且沒有特殊用例,請(qǐng)使用默認(rèn)設(shè)置。 但是,如果您希望擴(kuò)展一臺(tái)機(jī)器之外的能力,那么從一臺(tái)機(jī)器中擠出最大的處理能力是必不可少的,因?yàn)樗梢詫⒛?wù)器的花費(fèi)減少一半(甚至