發(fā)布擴(kuò)展信息
擴(kuò)展可以發(fā)布 phpinfo()
或反射API要求的信息。我們一起來看一下。
本章不會太長,因?yàn)檎娴暮芎唵巍?/p>
相關(guān)學(xué)習(xí)推薦:PHP編程從入門到精通
MINFO( ) 掛鉤
如果聲明了,一切都在聲明的 MINFO()
掛鉤中進(jìn)行。如果未聲明,則引擎將運(yùn)行默認(rèn)功能以打印有關(guān)擴(kuò)展名的信息。該功能只會打印擴(kuò)展程序的版本以及最終聲明的 INI條目 。
如果要加入此過程,則必須在擴(kuò)展結(jié)構(gòu)中聲明一個(gè) MINFO()
hook。
注意
一切都在 ext / standard / info.c 中進(jìn)行,您可以閱讀該文件。引擎通過調(diào)用 php_info_print_module() 來打印有關(guān)PHP擴(kuò)展的信息
下面是一個(gè)簡單的 MINFO()
案例:
#include "php/main/SAPI.h" #include "ext/standard/info.h" #define PIB_TXT "PHPInternalsBook Authors" #define PIB_HTML "<h3>" PIB_TXT "</h3>" PHP_MINFO_FUNCTION(pib) { time_t t; char cur_time[32]; time(&t); php_asctime_r(localtime(&t), cur_time); php_info_print_table_start(); php_info_print_table_colspan_header(2, "PHPInternalsBook"); php_info_print_table_row(2, "Current time", cur_time); php_info_print_table_end(); php_info_print_box_start(0); if (!sapi_module.phpinfo_as_text) { php_write(PIB_HTML, strlen(PIB_HTML)); } else { php_write(PIB_TXT, strlen(PIB_TXT)); } php_info_print_box_end(); } zend_module_entry pib_module_entry = { STANDARD_MODULE_HEADER, "pib", NULL, /* Function 入口 */ NULL, /* Module 初始化 */ NULL, /* Module 關(guān)閉 */ NULL, /* Request 初始化 */ NULL, /* Request 關(guān)閉 */ PHP_MINFO(pib), /* Module information */ "0.1", /* 擴(kuò)展的版本號寫在這里 */ STANDARD_MODULE_PROPERTIES };
你要做的主要是處理 php_info_print_*()
API,它允許你將信息打印到生成的輸出流中。如果你想要打印一些原始的信息,一個(gè)簡單的 php_write()
就足夠了。php_write()
就是把你傳入的信息當(dāng)作 SAPI 輸出流的一個(gè)參數(shù), 而 php_info_print_*()
API 也是一樣,但是之前會被按照要求格式化,如果想要 HTML 格式,則會使用 HTML 的 table-tr-td 標(biāo)簽,如果不需要格式化成 HTML 的話,就會簡單的用空格間隔。
如你所見,你必須 include ext/standard/info.h 以引入 php_info_print_*()
API ,并且你還需要引入 php/main/SAPI.h 來獲得 sapi_module
符號。這個(gè)符號是全局的,它代表了當(dāng)前 PHP 進(jìn)程所使用的 SAPI 。phpinfo_as_text
字段告訴你,如果你準(zhǔn)備寫入一個(gè)類似比如 php-fpm 的 “Web” 的 SAPI 或者寫入一個(gè)類似 php-cli 的 “text” 的(SAPI)。
能觸發(fā)你的 MINFO()
鉤子的是下面這些:
- 調(diào)用用戶端的
phpinfo()
函數(shù) php -i
、php-cgi -i
、php-fpm -i
?;蛘吒橄蟮谋硎鼍褪?<SAPI_binary> - i
php --ri
或者用戶端的ReflectionExtension::info()
注意:
要留意輸出的格式。如果你需要在 text 和 HTML 之間轉(zhuǎn)換格式,就研究一下
sapi_module.phpinfo_as_text
。你無法得知在用戶端擴(kuò)展的信息是被如何調(diào)用的。
如果你要展示你的 INI 設(shè)置,只要在你的 MINFO()
中調(diào)用 DISPLAY_INI_ENTRIES()
宏即可。這個(gè)宏的解析看這里 display_ini_entries().
能觸發(fā)你的 MINFO()
鉤子的是下面這些:
- 調(diào)用用戶端的
phpinfo()
函數(shù) php -i
、php-cgi -i
、php-fpm -i
?;蛘吒橄蟮谋硎鼍褪?<SAPI_binary> - i
php --ri
或者用戶端的ReflectionExtension::info()
注意:
要留意輸出的格式。如果你需要在 text 和 HTML 之間轉(zhuǎn)換格式,就研究一下
sapi_module.phpinfo_as_text
。你無法得知在用戶端擴(kuò)展的信息是被如何調(diào)用的。
如果你要展示你的 INI 設(shè)置,只要在你的 MINFO()
中調(diào)用 DISPLAY_INI_ENTRIES()
宏即可。這個(gè)宏的解析看這里 display_ini_entries().
關(guān)于反射 API 的說明
反射大量使用你的zend_module_entry
結(jié)構(gòu)。例如,當(dāng)你調(diào)用ReflectionExtension::getVersion()
時(shí),API 只會讀取zend_module_entry
結(jié)構(gòu)的版本字段。
與發(fā)現(xiàn)函數(shù)相同,你的zend_module_entry
具有一個(gè)const struct _zend_function_entry * functions
成員,該成員用于注冊PHP函數(shù)。
基本上,PHP 用戶區(qū)反射 API 只會讀取你的zend_module_entry
結(jié)構(gòu)并發(fā)布這些信息。它還可以使用你的module_number
來收集在引擎的不同位置注冊的擴(kuò)展的信息。例如,ReflectionExtension::getINIentries()
或 ReflectionExtension::getClasses()
使用了這個(gè)。