首頁 >後端開發 >PHP問題 >phpfpm工作原理是什麼?

phpfpm工作原理是什麼?

青灯夜游
青灯夜游原創
2019-10-16 13:54:143747瀏覽

php-fpm是一種master(主)/worker(子)多流程架構,與nginx設計風格有點類似。 master進程主要負責CGI及PHP環境初始化、事件監聽、子進程狀態等等,worker進程負責處理php請求。

phpfpm工作原理是什麼?

運作原理

#php-fpm採用master/worker架構設計,前面簡單地描述master和worker進程模組的功能。以下將詳細講解這兩個模組的運作原理。

master流程

master行程工作流程分成4個階段,如下圖: 

phpfpm工作原理是什麼?

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進程分為 接收客戶端請求、處理請求、請求結束三個階段。 

phpfpm工作原理是什麼?

1、接收客戶端請求:執行fcgi_accept_request函數,其內部透過呼叫accept函數來取得客戶端請求。

//请求锁
FCGI_LOCK(req->listen_socket);
req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len);
//释放锁
FCGI_UNLOCK(req->listen_socket);

從上面的程式碼,可以注意到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()方法,發送回應內容、釋放記憶體等操作。

總結

php-fpm採用master/worker架構設計, master流程負責CGI、PHP公共環境的初始化及事件監聽作業。 worker進程負責請求的處理功能。在worker進程處理請求時,無需再次初始化PHP運行環境,這也是php-fpm效能優異的原因之一。

更多PHP相關知識,請造訪php中文網

以上是phpfpm工作原理是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn