phpfpm的原理是什么?


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

  

運行原理

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

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函數獲取客戶端請求。 

 

從上面的代碼,可以注意到accept之前有一個請求鎖的操作,這么設計是為了避免請求出現“驚群”的現象。當然,這是一個可選的選項,可以取消該功能。

2、處理請求階段:首先,分別調用fpm_request_info、php_request_startup獲取請求內容及注冊全局變量(GET、_GET、
G

ET、_POST、SERVER、_SERVER、
S

ERVER、_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交流群:點擊進群


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM