閒聊 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接替

透過這樣的方式達到平滑重啟