從apche的模塊方式進入php
上回說道apache調用php有兩種方式一個是模塊方式,一種是cgi模式,我就從模塊方式調用php開始分析。
首先得看看Php源代碼目錄機構
摘自:http://www.php-internal.com/book/?p=chapt01/01-02-code-structure
-
根目錄:/ 這個目錄包含的東西比較多,主要包含一些說明文件以及設計方案。其實項目中的這些README文件是非常值得閱讀的例如:
-
/README.PHP4-TO-PHP5-THIN-CHANGES這個文件就詳細列舉了PHP4和PHP5的一些差異。
-
還有有一個比較重要的文件/CODING_STANDARDS,如果要想寫PHP擴展的話,這個文件一定要閱讀一下,不管你個人的代碼風格是什麼樣,怎麼樣使用縮進和花括號,既然來到了這樣一個團體裏就應該去適應這樣的規範,這樣在閱讀代碼或者別人閱讀你的代碼是都會更輕鬆。
-
-
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/