一:概述php
- FPM 定義html
- FPM(FastCGI Process Manager)是PHP FastCGI運行模式的一個進程管理器。web
- FastCGIshell
- Web服務器(如:Nginx、Apache)和處理程序之間的一種通訊協議。服務器
- 注意:它只是一種協議!(與HTTP協議相似)網絡
- 具體請戳 《PHP - CGI/Fastcgi/PHP-FPM》socket
二:FPM 的做用函數
- PHP只是一個腳本解析器,咱們能夠把它理解爲一個普通的函數,輸入是PHP腳本。輸出是執行結果。工具
- 假如咱們想用PHP代替shell,在命令行中執行一個文件,那麼就能夠寫一個程序來嵌入PHP解析器,這就是cli模式,這種模式下PHP就是普通的一個命令工具。spa
- 接着咱們又想:能不能讓PHP處理http請求呢?這時就涉及到了網絡處理,PHP須要接收請求、解析協議,而後處理完成返回請求。
- 在網絡應用場景下,PHP並無像Golang那樣實現http網絡庫,而是實現了FastCGI協議,而後與web服務器配合實現了http的處理,web服務器來處理http請求。
- 而後將解析的結果再經過FastCGI協議轉發給處理程序,處理程序處理完成後將結果返回給web服務器,web服務器再返回給用戶。
-
三:FPM 的實現
- FPM 的實現就是建立一個 master 進程,在 master 進程中建立並監聽socket,而後 fork 出多個子進程,這些子進程各自 accept 請求.
- 子進程的處理很是簡單,子進程啓動後阻塞在accept上,有請求到達後開始讀取請求數據,讀取完成後開始處理而後再返回
- 在子進程處理期間是不會接收其它請求的,也就是說fpm的子進程同時只能響應一個請求,只有把這個請求處理完成後纔會accept下一個請求
- fpm的master進程與worker進程之間不會直接進行通訊,master經過共享內存獲取worker進程的信息,好比worker進程當前狀態、已處理請求數等
- 當master進程要殺掉一個worker進程時則經過發送信號的方式通知worker進程。
- 具體實現上 是 多個worker pool組成一個單鏈表:
四:請求處理
- 流程就是worker進程不斷accept請求,而後執行PHP腳本並返回
- 總體流程
- (1)等待請求: worker進程阻塞在fcgi_accept_request()等待請求;
- (2)解析請求: fastcgi請求到達後被worker接收,而後開始接收並解析請求數據,直到request數據徹底到達;
- (3)請求初始化: 執行php_request_startup(),此階段會調用每一個擴展的:PHP_RINIT_FUNCTION();
- (4)編譯、執行: 由php_execute_script()完成PHP腳本的編譯、執行;
- (5)關閉請求: 請求完成後執行php_request_shutdown(),此階段會調用每一個擴展的:PHP_RSHUTDOWN_FUNCTION(),而後進入步驟(1)等待下一個請求。