PHP的執行流程,PHP擴充套件載入過程 原創

2022-03-16 08:57:23 字數 3078 閱讀 8689

為了以後能開發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函式

1 23 4

5 67 8

9 10

11 12

13 14

15 16

17 18

19 20

staticvoidphp_init_handler(server_rec *s, pool *p)

#if module_magic_number >= 19980527 }

#endif }

該函式主要呼叫 兩個函式

sapi_startup(&apache_sapi_module);

php_apache_startup(&apache_sapi_module);

1 23 4

5 67 8

9 10

11 12

13 14

15

sapi_apivoidsapi_startup(sapi_module_struct *sf)

sapi_startup建立乙個 sapi_globals_struct結構體.

sapi_globals_struct儲存了apache請求的基本資訊,如伺服器資訊,header,編碼等.

1 23 4

5 6

staticvoidsapi_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

1 23 4

5 67 8

staticintphp_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

1 23 4

5 67 8

voidphp_ini_register_extensions(tsrmls_d)

zend_llist_apply函式遍歷extension_lists 執行會掉函式 php_load_php_extension_cb

php_load_php_extension_cb

1 23 4

staticvoidphp_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

1 23 4 5

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...

php擴充套件開發流程

需求 比如開發乙個叫做 heiyeluren 的擴充套件,擴充套件裡就乙個函式 heiyeluren test 輸入乙個字串,函式返回 your input string xx。要求 了解c c 程式設計,熟悉php程式設計 步驟一 生成擴充套件框架 cd root soft php php 5.2...

PHP擴充套件 擴充套件的載入順序及調整

首先找到php擴充套件載入目錄 php i grep extension dir 得到 usr lib64 php modules 那麼這個目錄在 設定的呢?php.ini裡面也沒有啊?我們在編譯安裝擴充套件的時候需要指定 with php config usr bin php config引數,就...