擴(kuò)展可以發(fā)布 phpinfo()
或反射API要求的信息。我們一起來(lái)看一下。
本章不會(huì)太長(zhǎng),因?yàn)檎娴暮芎?jiǎn)單。
MINFO( ) 掛鉤如果聲明了,一切都在聲明的 MINFO()
掛鉤中進(jìn)行。如果未聲明,則引擎將運(yùn)行默認(rèn)功能以打印有關(guān)擴(kuò)展名的信息。該功能只會(huì)打印擴(kuò)展程序的版本以及最終聲明的 INI條目 。
如果要加入此過(guò)程,則必須在擴(kuò)展結(jié)構(gòu)中聲明一個(gè) MINFO()
hook。
一切都在 ext / standard / info.c 中進(jìn)行,您可以閱讀該文件。引擎通過(guò)調(diào)用 php_info_print_module() 來(lái)打印有關(guān)PHP擴(kuò)展的信息
下面是一個(gè)簡(jiǎn)單的 MINFO()
案例:
#include "php/main/SAPI.h" #include "ext/standard/info.h" #define PIB_TXT "PHPInternalsBook Authors" #define PIB_HTML "" PIB_TXT "
" 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ò)展的版本號(hào)寫(xiě)在這里 */ STANDARD_MODULE_PROPERTIES };
你要做的主要是處理 php_info_print_*()
API,它允許你將信息打印到生成的輸出流中。如果你想要打印一些原始的信息,一個(gè)簡(jiǎn)單的 php_write()
就足夠了。php_write()
就是把你傳入的信息當(dāng)作 SAPI 輸出流的一個(gè)參數(shù), 而 php_info_print_*()
API 也是一樣,但是之前會(huì)被按照要求格式化,如果想要 HTML 格式,則會(huì)使用 HTML 的 table-tr-td標(biāo)簽,如果不需要格式化成 HTML 的話(huà),就會(huì)簡(jiǎn)單的用空格間隔。
如你所見(jiàn),你必須 include ext/standard/info.h以引入 php_info_print_*()
API ,并且你還需要引入 php/main/SAPI.h來(lái)獲得 sapi_module
符號(hào)。這個(gè)符號(hào)是全局的,它代表了當(dāng)前 PHP 進(jìn)程所使用的 SAPI。phpinfo_as_text
字段告訴你,如果你準(zhǔn)備寫(xiě)入一個(gè)類(lèi)似比如 php-fpm的 “Web” 的 SAPI 或者寫(xiě)入一個(gè)類(lèi)似 php-cli的 “text” 的(SAPI)。
能觸發(fā)你的 MINFO()
鉤子的是下面這些:
phpinfo()
函數(shù)php -i
、 php-cgi -i
、 php-fpm -i
?;蛘吒橄蟮谋硎鼍褪? - i
php --ri
或者用戶(hù)端的 ReflectionExtension::info()
注意:
要留意輸出的格式。如果你需要在 text 和 HTML 之間轉(zhuǎn)換格式,就研究一下
sapi_module.phpinfo_as_text
。你無(wú)法得知在用戶(hù)端擴(kuò)展的信息是被如何調(diào)用的。
如果你要展示你的 INI 設(shè)置,只要在你的 MINFO()
中調(diào)用 DISPLAY_INI_ENTRIES()
宏即可。這個(gè)宏的解析看這里 display_ini_entries().
能觸發(fā)你的 MINFO()
鉤子的是下面這些:
phpinfo()
函數(shù)php -i
、 php-cgi -i
、 php-fpm -i
?;蛘吒橄蟮谋硎鼍褪? - i
php --ri
或者用戶(hù)端的 ReflectionExtension::info()
注意:
要留意輸出的格式。如果你需要在 text 和 HTML 之間轉(zhuǎn)換格式,就研究一下
sapi_module.phpinfo_as_text
。你無(wú)法得知在用戶(hù)端擴(kuò)展的信息是被如何調(diào)用的。
如果你要展示你的 INI 設(shè)置,只要在你的 MINFO()
中調(diào)用 DISPLAY_INI_ENTRIES()
宏即可。這個(gè)宏的解析看這里 display_ini_entries().
反射大量使用你的zend_module_entry
結(jié)構(gòu)。例如,當(dāng)你調(diào)用ReflectionExtension::getVersion()
時(shí),API 只會(huì)讀取zend_module_entry
結(jié)構(gòu)的版本字段。
與發(fā)現(xiàn)函數(shù)相同,你的zend_module_entry
具有一個(gè)const struct _zend_function_entry * functions
成員,該成員用于注冊(cè)PHP函數(shù)。
基本上,PHP 用戶(hù)區(qū)反射 API 只會(huì)讀取你的zend_module_entry
結(jié)構(gòu)并發(fā)布這些信息。它還可以使用你的module_number
來(lái)收集在引擎的不同位置注冊(cè)的擴(kuò)展的信息。例如,ReflectionExtension::getINIentries()
或 ReflectionExtension::getClasses()
使用了這個(gè)。
網(wǎng)站名稱(chēng):php如何發(fā)布擴(kuò)展信息
文章出自:http://weahome.cn/article/cghsjd.html