閒聊 FastCGI 與 PHP-FPM
在這裡記錄一下 FastCGI 與 PHP-FPM 的關係
關於 FastCGI
FastCGI 是一個協定,從字面上其實就能看到 Fast + CGI,意思就是加速CGI
CGI 是一個協定,在webserver接收到請求時,會跟請求內容進行對應處理,再返回對應文件給瀏覽器
例如,
如果請求 index.html 文件,會直接將 index.html 返回給瀏覽器
如果請求 index.php 文件,就要將這筆請求先傳給 php 解析器處理成html格式,再將 html內容返回給瀏覽器
在這過程中,每一次 php 文件請求過來時,php 解析器都要檢查 php.ini 設定,初始化,會消耗掉不少資源
而 FastCGI 會透過一個 master 在第一次啟動 php server 時,負責解析 php.ini 文件配置,
並且記住這些資訊來建立 worker
接下來,Master 就會專注負責監聽接口,一接收到請求就立即分配任務給底下的 worker
worker 會負責解析PHP檔案
透過這樣的方式避免重新執行初始化的行為,減少不必要的消耗
PHP-FPM
PHP-FPM 其實就是將 FastCGI 協定進行實作
因此,按照 FastCGI 的設計方式,在第一次啟動 PHP-FPM 之後,就會記住當時的 php server 配置
如果之後有進行修改,就要再重新啟動,才能再讀取到更新的設定
當Master 收到請求,會將請求丟給一個worker
當所有worker 快不夠用時,Master 可以根據配置來生成新的 worker 備用
若是情求資源不多時,Master則會適量殺死 worker ,以提升效能
此外,PHP-FPM 能做到平滑重啟,讓伺服器能穩定地提供服務
處理的方式是讓新的worker 套用新的設定,而就的 worker 會繼續執行手上的工作,執行完畢就會被終止,再由新的worker接替
透過這樣的方式達到平滑重啟