nginx是一個webservice的功能,當檢測到訪問php檔案時,會把請求交給fastcgi模組處理。我們可以在nginx的配置檔案中配置fastcgi的相關引數
nginx的fastcgi模組會把請求交給php-fpm程式處理。php-fpm的worker程式處理完後,會把資料返回給nginx,nginx會把資料放到記憶體快取中,快取區大小為fastcgi_buffer_size,fastcgi_buffers控制。如果返回資料大於快取,則多出來的資料會被臨時寫入到檔案中,放在fastcgi_temp目錄下面。
#### PHP-FPM
php-fpm是一種master(主)/worker(子)多程式架構
master的工作分為四步:
1.cgi初始化階段:分別呼叫fcgi_init()和 sapi_startup()函式,註冊程式訊號以及初始化sapi_globals全域性變數。
2.php環境初始化階段: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程式分三步:
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()方法,傳送響應內容、釋放記憶體等操作。
常見錯誤碼
502:請求的PHP-CGI已經執行,但是由於某種原因(一般是讀取資源的問題)沒有執行完畢而導致PHP-CGI程式終止,比如php-fpm的worker程式的最大執行時間超過了,或者其他原因提前終止了。Nginx會發現與自己通訊的連線斷掉了,就會返回給客戶端502錯誤。
504:簡單來說就是沒有請求到可以執行的PHP-CGI(php-fpm沒有開啟或者worker數量不足),或者nginx的Fastcgi的引數fastcgi_connect_timeout 超時,就是說php-fpm的執行時間超過了nginx的fastcgi連線時間限制。
本作品採用《CC 協議》,轉載必須註明作者和本文連結