php-fpm-執行原理
php-fpm是一種master(主)/worker(子)多程序架構,與nginx設計風格有點類似。master程序主要負責CGI及PHP環境初始化、事件監聽、子程序狀態等等,worker程序負責處理php請求。 master程序: master程序工作流程分為4個階段,如下圖:  1. cgi初始化階段:分別呼叫fcgi_init()和 sapi_startup()函式,註冊程序訊號以及初始化sapi_globals全域性變數。 2. php環境初始化階段:由cgi_sapi_module.startup 觸發。實際呼叫php_cgi_startup函式,而php_cgi_startup內部又呼叫php_module_startup執行。php_module_startup主要功能:a).載入和解析php配置;b).載入php模組並記入函式符號表(function_table);c).載入zend擴充套件 ;d).設定禁用函式和類庫配置;e).註冊回收記憶體方法; 3. php-fpm初始化階段:執行fpm_init()函式。負責解析php-fpm.conf檔案配置,獲取程序相關引數(允許程序開啟的最大檔案數等),初始化程序池及事件模型等操作。 4. php-fpm執行階段:執行fpm_run() 函式,執行後主程序發生阻塞。該階段分為兩部分:fork子程序 和 迴圈事件。fork子程序部分交由fpm_children_create_initial函式處理( 注:ondemand模式在fpm_pctl_on_socket_accept函式建立)。迴圈事件部分通過fpm_event_loop函式處理,其內部是一個死迴圈,負責事件的收集工作。 worker程序: worker程序分為 接收客戶端請求、處理請求、請求結束三個階段。 1. 接收客戶端請求:執行fcgi_accept_request函式,其內部通過呼叫accept 函式獲取客戶端請求。 2. 處理請求階段:首先,分別呼叫fpm_request_info、php_request_startup獲取請求內容及註冊全域性變數($_GET、$_POST、$_SERVER、$_ENV、$_FILES);然後根據請求資訊呼叫php_fopen_primary_script訪問指令碼檔案;最後交給php_execute_script執行。php_execute_script內部呼叫zend_execute_scripts方法將指令碼交給zend引擎處理。 3. 請求結束階段:執行php_request_shutdown函式。此時 回撥register_shutdown_function註冊的函式及__destruct()方法,傳送響應內容、釋放記憶體等操作。