PHP Core---LifeCycle
PHP CORE
PHP核心由兩個單獨的部分組成,底層部分就是 Zend Engine, ZE負責把人類可讀的指令碼解析成為機器可讀的tokens, 然後在一個處理空間中執行這些tokens,ZE同時還要處理記憶體管理,變數範圍以及分發(dispatch)函數調用;
另外一層就是PHP核心(php core),負責串連 ?綁定的SAPI層,SAPI即 Server Application Programming Interface, 通常會參考主機環境,例如IIS ?CLI ?CGI等等,它也提供了一個統一的控制層,用於safe_mode 和 open_basedir的檢查,像串連檔案和網路I/O的streams層,有fopen() fread() 以及fwriter()方法。
Lifecycles
當某一個主機環境下的SAPI啟動的時候,例如/usr/local/apache/bin/apachectl啟動時, php開始會去初始化他核心的子系統(subsystems), 接下來, 在這個啟動程式的末尾, php會去裝載每一個擴充部分(Extension)的代碼以及調用它們的模組初始程式(Module Initialization routing , MINIT), 這樣就讓每一個Extension有機會去初始化內部的變數,資源的分配,資源控制代碼的註冊以及在ZE裡註冊他們的函數,這樣當指令碼調用這些函數中的某一個的時候,ZE就會知道要執行哪一段代碼。
? ? 接下來,PHP就會等待SAPI層要請求執行的一個頁面,在CGI或者CLI SAPI這些環境之,這個是立即發生的並且只執行一次;在Apache, IIS或其他成熟的web server的SAPI中,他只在遠端使用者請求的時候才會發生,或者是重複任意次數,這兩種也有可能是並發的。
? ?不管請求是如何到達的, PHP都會去請求ZE設定一個讓指令碼啟動並執行環境,然後調用每一個擴充的請求初始化函數(Request Initialization?(RINIT) function),?RINIT 讓每一個Extension有機會去建立特殊的環境變數 , 分配請求指定的資源以及執行一些其他的,比如審計的任務。舉個例子,比如Session Extension, 在php.ini檔案中如果session.auto_start這個參數被設定為了1(預設是0), 級說明允許自動啟動session, 那麼RINIT將會自動觸發使用者空間的session_start()函數以及預先設定$_SESSION變數。
? ?一旦請求被初始化了之後, ZE就會將php指令碼翻譯為tokens, 最後成為可執行檔作業碼(opcodes), 如何作業碼中調用了一個extension的函數,那麼ZE將會把參數傳遞給這個函數,並且臨時交出控制權知道函數執行完畢。
? ?當一份指令碼執行完畢之後, php將會調用每一個extension的請求停止函數(Request Shutdown(RSHUTDOWN) function)去執行最後一次的清理操作,例如將session變數儲存到磁碟。 ? 然後 ZE會執行一個清理進程,即我們熟知的垃圾收集(garbage collection), ?garbage collection 能有效在前一次請求的每一個變數上執行一個unset()方法來釋放變數。
? ?當完成這些之後, php會等待SAPI的下一次請求或者只是一個終止操作, 在CGI and CLI SAPIs裡沒有下一次請求,?SAPI會馬上執行shutdown操作。在執行shutdown期間, ?php會迴圈每一個extension, 並且調用他們的?Module Shutdown?(MSHUTDOWN) functions, 這個與前面的Module Initialization routing是對應的。在終止了所有的extension之後, php最後會 shut down 他自己的核心子系統。
? ?從上我們可以看出, ?在一次請求的過程中,ZE和PHP CORE各司其責, ?php core負責接收請求處理請求, 而ZE負責php指令碼的執行。
?
?
?
?