從apche的模組方式進入php
上回說道apache調用php有兩種方式一個是模組方式,一種是cgi模式,我就從模組方式調用php開始分析。
首先得看看Php原始碼目錄機構
摘自:http://www.php-internal.com/book/?p=chapt01/01-02-code-structure
根目錄:/
這個目錄包含的東西比較多,主要包含一些說明檔案以及設計方案。其實項目中的這些README檔案是非常值得閱讀的例如:
build顧名思義,這裡主要放置一些和源碼編譯相關的一些檔案,比如開始構建之前的buildconf指令碼等檔案,還有一些檢查環境的指令碼等。
ext官方擴充目錄,包括了絕大多數PHP的函數的定義和實現,如array系列,pdo系列,spl系列等函數的實現,都在這個目錄中。個人寫的擴充在測試時也可以放到這個目錄,方便測試和調試。
main這裡存放的就是PHP最為核心的檔案了,主要實現PHP的基本設施,這裡和Zend引擎不一樣,Zend引擎主要實現語言最核心的語言運行環境。
ZendZend引擎的實現目錄,比如指令碼的詞法文法解析,opcode的執行以及擴充機制的實現等等。
pear“PHP
擴充與應用倉庫”,包含PEAR的核心檔案。
sapi包含了各種伺服器抽象層的代碼,例如apache的mod_php,cgi,fastcgi以及fpm等等介面。
TSRMPHP的安全執行緒是構建在TSRM庫之上的,PHP實現中常見的*G宏通常是對TSRM的封裝,TSRM(ThreadSafe
Resource Manager)安全執行緒資源管理員。
testsPHP的測試指令碼集合,包含PHP各項功能的測試檔案
win32這個目錄主要包括Windows平台相關的一些實現,比如sokcet的實現在Windows下和*Nix平台就不太一樣,同時也包括了Windows下編譯PHP相關的指令碼。
要想apache能運行php檔案得做一些配置。否則php檔案會被當作檔案被輸出。
採用模組方式運行php,在apache的設定檔中需要添加
LoadModulephp5_module /usr/lib/apache2/modules/libphp5.so
這樣的一句。其實就是說載入php模組
apache在啟動時候會載入php模組,通過載入結構體:
AP_MODULE_DECLARE_DATAmodule php5_module = {STANDARD20_MODULE_STUFF,/*宏,包括版本,小版本,模組索引,模組名,下一個模組指標等資訊,其中模組名以__FILE__體現*/create_php_config, /*建立php目錄配置*/merge_php_config, /*合并php目錄配置*/NULL, /*建立主機目錄配置 */NULL, /*合并主機合并配置*/php_dir_cmds, /*為模組配置相關指令 */php_ap2_register_hook /*註冊模組的鉤子函數 */};
此代碼在./sapi/apache2handler/mod_php5.c中。
apache通過這裡的配置配置參數,分別載入對應的配置。apapche會維護三個鏈表:hook鏈表模組鏈表模組配置鏈表。將這些配置分別加入到這三個鏈表中。這裡涉及到apache的一些細節,這兩天看得有點迷糊。下次做專門研究。
參數說明:
STANDARD20_MODULE_STUFF,這個參數是個宏,儲存了模組當前適應的apapche版本資訊,apapche載入模組的時候會檢測這個宏中的定義來看是否相容此模組,如果不相容則停止載入。
create_php_config
merge_php_config是兩個函數指標在同目錄下的apache_config.c中。當apache啟動配置時候會調用做初始化配置。(這裡詳細的得後查)
主機的配置主要用於伺服器虛擬機器主機,php不是先虛擬機器主機,沒有。
php_dir_cmds也是以函數指標,也在apache_config.c中。主要用於註冊php啟動時候傳遞給php的參數鉤子。其中有5個鉤子:php_value,php_flag
php_admin_value php_admin_flag PHPINIDir主要應用與不同目錄和網站對調用不同php配置的情況:詳情參看:http://blog.zuoxizhidu.com/1/125.htm
php_ap2_register_hook應用處理相關的鉤子 ,也在sapi_apache2.c中。其註冊了4個鉤子。
伺服器啟動時調用ap_hook_pre_config,ap_hook_post_config,ap_hook_child_init。ap_hook_pre_config鉤子用於檢測php進程是否啟動,已經啟動報錯。ap_hook_post_config調用的是函數php_apache_server_startup用於php模組在這裡會被正式啟動,初始化php和zend
ap_hook_child_init用於子進程的啟動。php_handle用於使用者請求時候的hook在這裡檢查檔案正式執行php。
一個啟動弄了好半天才看得稍微明白,慚愧!
如果我理解的不對的 希望大牛幫忙指正!
另外發現一個看php原始碼的好網站,直接給函數定義上了連結 一點就可以進函數定義和引用的地方非常好http://lxr.sweon.net/