【php原始碼學習筆記】php的啟動

來源:互聯網
上載者:User

從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/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.