為了以後能開發php擴充套件,就一定要了解php的執行順序。這篇文章就是為c開發php擴充套件做鋪墊。apache啟動後會將mod_pho5.so模組的hook handler註冊進來,當apache檢測到訪問的url是乙個php檔案時,這時候就會把控制權交給sapi。進入到sapi後,首先會執行sapi/apache/mod_php5.c 檔案的php_init_handler函式,web環境我們假設為apache。在編譯php的時候,為了能夠讓apache支援php,我們會生成乙個mod_php5.so的模組。apache載入這個模組,在url訪問.php檔案的時候,就會轉給mod_php5.so模組來處理。
這裡摘錄一段**:
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);
static int php_apache_startup(sapi_module_struct *sapi_module)else
}
sapi_startup建立乙個 sapi_globals_struct結構體。sapi_globals_struct儲存了apache請求的基本資訊,如伺服器資訊,header,編碼等。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配置
return 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)
該函式最後呼叫
dl_unload(handle);
return failure;
}將擴充套件資訊放到 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)
小程式執行執行過程原理 程式執行原理
計算機中包含有較多的硬體,但是乙個程式要執行,有三個核心的硬體,分別是 cpu 記憶體 硬碟 計算機中哪乙個硬體裝置負責執行程式?記憶體的速度快還是硬碟的速度快?我們的程式是安裝在記憶體中的,還是安裝在硬碟中的?我買了乙個記憶體條,有 500g 的空間!這句話對嗎?計算機關機之後,記憶體中的資料都會...
CPU執行程式的原理(簡化過程)
ram 指記憶體,斷電後內容無法儲存,因此叫做易失性儲存 另乙個相關的概念是rom,字面上是唯讀儲存器,從字面上裡面更適合用於嵌入式裝置,現在意義有所延伸,具體自行查詢資料。ram的速度遠快於rom,cpu與記憶體直接進行資料交換。cpu 計算機的所有計算操作都由它執行,只要先記住它是一塊有輸入和輸...
CPU執行程式的原理(簡化過程)
看了網上的一些描述cpu執行程式的過程,發現他們涉及到的內容太多了,恨不能把整個cpu的底層結構都拿出來說,這對計算機理論知識匱乏的新人甚至是一些老人都是非常不友好的。這個問題也是當初攔在我面前的乙隻大老虎,把這個原理寫出來也有助於我自己的深入理解。cpu 計算機的所有計算操作都由它執行,只要先記住...