宣告:本文為
斯人原創,全部為作者一一分析得之,有不對的地方望賜教。
為了以後能夠明白的開發php擴充套件..就一定要了解php的執行順序..這篇文章就是為c開發php擴充套件做鋪墊.
web環境 我們假設為 apache.
在編譯php的時候,為了能夠讓apache支援php,我們會生成乙個mod_php5.so的模組.apache載入這個模組..
在url訪問.php檔案的時候就會轉給mod_php5.so模組來處理.這個玩意是什麼..就是我們常說的sapi
英文名字是:server abstraction api.
sapi說的其實是乙個統稱,其下有 isapi,cli sapi, cgi等.
有了它,就可以很容易的跟其他東西互動.比如apache,iis,cgi等.
好了回到正題.
apache啟動後會將mod_pho5.so模組的hook handler註冊進來.apache今天不是主角,所以不細說.
當apache檢測到 訪問的url是乙個php檔案時,這時候就會把控制權交給sapi.
進入到sapi後,首先會執行sapi/apache/mod_php5.c 檔案的php_init_handler函式
static void php_init_handler(server_rec *s, pool *p)
#if module_magic_number >= 19980527
}#endif
}
該函式主要呼叫 兩個函式
sapi_startup(&apache_sapi_module);
php_apache_startup(&apache_sapi_module);
sapi_api void sapi_startup(sapi_module_struct *sf)
sapi_startup建立乙個 sapi_globals_struct結構體.
sapi_globals_struct儲存了apache請求的基本資訊,如伺服器資訊,header,編碼等.
static void sapi_globals_ctor(sapi_globals_struct *sapi_globals tsrmls_dc)
known_post_content_types是乙個hashtable,將其大小初始化為5.從字面意義上我猜測它儲存的應該是客戶端傳遞過來的內容型別.
php_setup_sapi_content_types函式將sapi_post_entry新增到sapi_globals裡
sapi_startup執行完畢後再執行php_apache_startup
static int php_apache_startup(sapi_module_struct *sapi_module)
else
}
php_module_startup 內容太多..是介紹一下作用.
1. 初始化zend_utility_functions 結構.這個結構是設定zend的函式指標,比如錯誤處理函式,輸出函式,流操作函式等.
2. 設定環境變數.
3. 載入php.ini配置.
4. 載入php內建擴充套件.
5. 寫日誌.
6. 註冊php內部函式集.
7. 呼叫 php_ini_register_extensions,載入所有外部擴充套件
8. 開啟所有擴充套件
9. 一些清理操作.
重點說一下 3,4,7,8
載入php.ini配置
if (php_init_config(tsrmls_c) == failure)
php_init_config函式會在這裡檢查所有php.ini配置,並且找到所有載入的模組,新增到php_extension_lists結構中.
載入php內建擴充套件
呼叫 zend_register_standard_ini_entries載入所有php的內建擴充套件,如array,mysql等.
呼叫 php_ini_register_extensions,載入所有外部擴充套件
main/php_ini.c
void php_ini_register_extensions(tsrmls_d)
php_load_php_extension_cb
static void php_load_zend_extension_cb(void *arg tsrmls_dc)
呼叫 ext/standard/dl.c zend_load_extension 載入擴充套件,
該函式略過..
該函式最後呼叫
if ((module_entry = zend_register_module_ex(module_entry tsrmls_cc)) == null)
將 擴充套件資訊 放到 hash表module_registry中
zend/zend_api.c
if (zend_hash_add(&module_registry, lcname, name_len+1, (void *)module, sizeof(zend_module_entry), (void**)&module_ptr)==failure)
最後zend_startup_modules(tsrmls_c); //對模組進行排序,並檢測是否註冊到module_registry hash表裡
zend_startup_extensions(); //執行extension->startup(extension);啟動擴充套件…
wow……….都半夜12點了…我的天.整整分析了三個小時…
就到這裡吧…
原文出處:
PHP的執行流程,PHP擴充套件載入過程 原創
為了以後能開發php擴充套件.就一定要了解php的執行順序.這篇文章就是為c開發php擴充套件做鋪墊.web環境 我們假設為 apache.在編譯php的時候,為了能夠讓apache支援php,我們會生成乙個mod php5.so的模組.apache載入這個模組.在url訪問.php檔案的時候就會轉...
CentOS下php加擴充套件功能
首先使mcrypt軟體能夠執行,然後安裝php擴充套件模組,並在php.ini配置。這裡注意的是mcrypt軟體依賴libmcrypt和mhash兩個庫,所以安裝配置順序從右至左 libmcrypt libmcrypt 2.5.8.tar.gz mcrypt mcrypt 2.6.8.tar.gz ...
php擴充套件開發流程
需求 比如開發乙個叫做 heiyeluren 的擴充套件,擴充套件裡就乙個函式 heiyeluren test 輸入乙個字串,函式返回 your input string xx。要求 了解c c 程式設計,熟悉php程式設計 步驟一 生成擴充套件框架 cd root soft php php 5.2...