【php源代碼學習筆記】php的啓動

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這個文件就詳細列舉了PHP4PHP5的一些差異。

    • 還有有一個比較重要的文件/CODING_STANDARDS,如果要想寫PHP擴展的話,這個文件一定要閱讀一下,不管你個人的代碼風格是什麼樣,怎麼樣使用縮進和花括號,既然來到了這樣一個團體裏就應該去適應這樣的規範,這樣在閱讀代碼或者別人閱讀你的代碼是都會更輕鬆。

  • build顧名思義,這裏主要放置一些和源碼編譯相關的一些文件,比如開始構建之前的buildconf腳本等文件,還有一些檢查環境的腳本等。

  • ext官方擴展目錄,包括了絕大多數PHP的函數的定義和實現,如array系列,pdo系列,spl系列等函數的實現,都在這個目錄中。個人寫的擴展在測試時也可以放到這個目錄,方便測試和調試。

  • main這裏存放的就是PHP最爲核心的文件了,主要實現PHP的基本設施,這裏和Zend引擎不一樣,Zend引擎主要實現語言最核心的語言運行環境。

  • ZendZend引擎的實現目錄,比如腳本的詞法語法解析,opcode的執行以及擴展機制的實現等等。

  • pear“PHP 擴展與應用倉庫”,包含PEAR的核心文件。

  • sapi包含了各種服務器抽象層的代碼,例如apachemod_phpcgifastcgi以及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_valuephp_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_configap_hook_post_configap_hook_child_initap_hook_pre_config鉤子用於檢測php進程是否啓動,已經啓動報錯。ap_hook_post_config調用的是函數php_apache_server_startup用於php模塊在這裏會被正式啓動,初始化phpzend

ap_hook_child_init用於子進程的啓動。php_handle用於用戶請求時候的hook在這裏檢查文件正式執行php




一個啓動弄了好半天才看得稍微明白,慚愧!


如果我理解的不對的 希望大牛幫忙指正!


另外發現一個看php源代碼的好網站,直接給函數定義上了鏈接 一點就可以進函數定義和引用的地方非常好http://lxr.sweon.net/










發佈了22 篇原創文章 · 獲贊 15 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章