## **簡述CGI、FAST-CGI、PHP-FPM的關系**

PHP-FPM 即 PHP FastCGI 進程管理器,要了解 PHP-FPM ,首先要看看 CGI 與 FastCGI 的關系。
CGI 的英文全名是 Common Gateway Interface,即通用網關接口,是 Web 服務器調用外部程序時所使用的一種服務端應用的規范。
早期的 Web 通信只是按照客戶端請求將保存在 Web 服務器硬盤中的數據轉發過去而已,這種情況下客戶端每次獲取的信息也是同樣的內容(即靜態請求,比如圖片、樣式文件、HTML文檔),而隨著 Web 的發展,Web 所能呈現的內容更加豐富,與用戶的交互日益頻繁,比如博客、論壇、電商網站、社交網絡等。
這個時候僅僅通過靜態資源已經無法滿足 Web 通信的需求,所以引入 CGI 以便客戶端請求能夠觸發 Web 服務器運行另一個外部程序,客戶端所輸入的數據也會傳給這個外部程序,該程序運行結束后會將生成的 HTML 和其他數據通過 Web 服務器再返回給客戶端(即動態請求,比如基于 PHP、Python、Java 實現的應用)。利用 CGI 可以針對用戶請求動態返回給客戶端各種各樣動態變化的信息。
FastCGI 顧名思義,是 CGI 的升級版本,為了提升 CGI 的性能而生,CGI 針對每個 HTTP 請求都會 fork 一個新進程來進行處理(解析配置文件、初始化執行環境、處理請求),然后把這個進程處理完的結果通過 Web 服務器轉發給用戶,剛剛 fork 的新進程也隨之退出,如果下次用戶再請求動態資源,那么 Web 服務器又再次 fork 一個新進程,如此周而復始循環往復。
而 FastCGI 則會先 fork 一個 master 進程,解析配置文件,初始化執行環境,然后再 fork 多個 worker 進程(與 Nginx 有點像),當 HTTP 請求過來時,master 進程將其會傳遞給一個 worker 進程,然后立即可以接受下一個請求,這樣就避免了重復的初始化操作,效率自然也就提高了。而且當 worker 進程不夠用時,master 進程還可以根據配置預先啟動幾個 worker 進程等著;當空閑 worker 進程太多時,也會關掉一些,這樣不僅提高了性能,還節約了系統資源。
這樣一來,PHP-FPM 就好理解了,FastCGI 只是一個協議規范,需要每個語言具體去實現,PHP-FPM 就是 PHP 版本的 FastCGI 協議實現,有了它,就是實現 PHP 腳本與 Web 服務器(通常是 Nginx)之間的通信,同時它也是一個 PHP SAPI,從而構建起 PHP 解釋器與 Web 服務器之間的橋梁。
PHP-FPM 負責管理一個進程池來處理來自 Web 服務器的 HTTP 動態請求,在 PHP-FPM 中,master 進程負責與 Web 服務器進行通信,接收 HTTP 請求,再將請求轉發給 worker 進程進行處理,worker 進程主要負責動態執行 PHP 代碼,處理完成后,將處理結果返回給 Web 服務器,再由 Web 服務器將結果發送給客戶端。這就是 PHP-FPM 的基本工作原理,
- PHP篇
- 函數傳值和傳引用的區別
- 簡述PHP的垃圾回收機制
- 簡述CGI、FAST-CGI、PHP-FPM的關系
- 常見正則表達式
- 多進程寫文件,如何保證都寫成功
- php支持回調函數的數組函數
- MySQL篇
- MySQL的兩種存儲引擎區別
- 事務的四大特性
- 數據庫事務隔離級別
- 什么是索引
- 索引有哪些數據結構,優缺點
- 索引的一些潛規則
- SQL的優化方案
- 簡述MySQL的鎖機制
- 死鎖是怎么產生的?怎么解決?
- 簡述MySQL的主從復制過程,延遲問題怎么解決
- 分布式事務的解決方案
- 數據庫中間件MyCat
- Linux篇
- Linux常用命令
- 對日志文件的IP出現的次數進行統計,并顯示次數最多的前5名
- WEB篇
- 跨域是怎么產生的,如何解決跨域
- Redis篇
- redis介紹
- redis和memcached區別
- redis的持久化方案
- 緩存穿透、擊穿、雪崩、預熱、更新、降級
- 網絡篇
- 計算機網絡體系結構
- 簡述TCP的三次握手、四次揮手過程
- UDP、TCP 區別,適用場景
- HTTP常見狀態碼含義
- 設計模式篇
- 單例模式
- 簡單工廠模式
- 抽象工廠模式
- 觀察者模式
- 策略模式
- 注冊模式
- 適配器模式
- 安全篇
- 跨站腳本攻擊(XSS)
- 跨站點請求偽造(CSRF)
- SQL 注入
- 應用層拒絕服務攻擊
- PHP安全
- 運維篇
- docker面試題
- 消息隊列篇
- 架構篇
- 數據結構與算法篇