首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 底層運行機制深度解析:從 SAPI 到 Zend 引擎的生命週期

     編輯:PHP 相關知識

架構總覽

  • SAPI (Server API):PHP 與 Web Server (Apache/IIS/Nginx) 的介面層,如 mod_php5.so。
  • PHP 核心:請求處理、檔案流、錯誤處理。
  • Zend Engine (ZE):原始碼編譯為 Opcode,在虛擬機執行。
  • 擴充層:函數庫、類別、流包裝器(如 mysql、gd、curl)。ZE 執行時按需調用擴充,完成任務後歸還控制權。

流程:請求 → SAPI → PHP 核心 → ZE 編譯/執行 → (呼叫擴充) → 結果回核心 → SAPI → 瀏覽器。

啟動階段:兩步走

步驟一:模組初始化 (MINIT) —— 僅在 SAPI 啟動時執行一次

  • 初始化環境變數(整個 SAPI 生命週期有效)。
  • 遍歷 php.ini 啟用的擴充,呼叫各自 MINIT 方法,註冊函數、類別、常數,進入可用狀態。
PHP_MINIT_FUNCTION(extension_name) {
    // 註冊函數、類別、常數等
}

步驟二:請求初始化 (RINIT) —— 每個請求執行一次

  • 建立請求專用變數表(符號表)。
  • 呼叫各擴充 RINIT,如 Session 模組初始化 $_SESSION 並讀取資料。
PHP_RINIT_FUNCTION(extension_name) {
    // 初始化會話變數、預填變數、重新定義全域變數
}

關閉階段:兩步走

步驟一:請求關閉 (RSHUTDOWN) —— 每請求結束執行

  • 按順序呼叫各模組 RSHUTDOWN,清理符號表(對每個變數 unset),釋放請求級記憶體。
PHP_RSHUTDOWN_FUNCTION(extension_name) {
    // 記憶體管理、unset 所有請求變數
}

步驟二:模組關閉 (MSHUTDOWN) —— SAPI 關閉時執行一次

  • 呼叫各擴充 MSHUTDOWN,釋放持久資源、句柄。
PHP_MSHUTDOWN_FUNCTION(extension_name) {
    // 釋放持久記憶體、關閉句柄
}

關鍵洞見

只有「無請求」時才會執行 MINIT/MSHUTDOWN。理解此生命週期,才能編寫高效擴充、排查記憶體洩漏、優化啟動速度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved