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