php内核介绍及扩展开发指南,4.5. 发布扩展信息
發布擴展信息
擴展可以發布 phpinfo() 或反射API要求的信息。我們一起來看一下。
本章不會太長,因為真的很簡單。
MINFO( ) 掛鉤
如果聲明了,一切都在聲明的 MINFO() 掛鉤中進行。如果未聲明,則引擎將運行默認功能以打印有關擴展名的信息。該功能只會打印擴展程序的版本以及最終聲明的 INI條目 。
如果要加入此過程,則必須在擴展結構中聲明一個 MINFO() hook。
注意
下面是一個簡單的?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 關閉 */
NULL, /* Request 初始化 */
NULL, /* Request 關閉 */
PHP_MINFO(pib), /* Module information */
"0.1", /* 擴展的版本號寫在這里 */
STANDARD_MODULE_PROPERTIES
};
你要做的主要是處理 php_info_print_*() API,它允許你將信息打印到生成的輸出流中。如果你想要打印一些原始的信息,一個簡單的 php_write() 就足夠了。php_write() 就是把你傳入的信息當作 SAPI 輸出流的一個參數, 而 php_info_print_*()?API 也是一樣,但是之前會被按照要求格式化,如果想要 HTML 格式,則會使用 HTML 的 table-tr-td?標簽,如果不需要格式化成 HTML 的話,就會簡單的用空格間隔。
如你所見,你必須 include ext/standard/info.h 以引入 php_info_print_*()?API ,并且你還需要引入 php/main/SAPI.h 來獲得 sapi_module 符號。這個符號是全局的,它代表了當前 PHP 進程所使用的 SAPI?。phpinfo_as_text 字段告訴你,如果你準備寫入一個類似比如 php-fpm 的 “Web” 的 SAPI 或者寫入一個類似 php-cli 的 “text” 的(SAPI)。
能觸發你的 MINFO() 鉤子的是下面這些:
調用用戶端的 phpinfo() 函數
php?-i 、 php-cgi?-i 、 php-fpm?-i 。或者更抽象的表述就是 ??-?i
php?--ri?或者用戶端的?ReflectionExtension::info()
注意:
要留意輸出的格式。如果你需要在 text 和 HTML 之間轉換格式,就研究一下 sapi_module.phpinfo_as_text 。你無法得知在用戶端擴展的信息是被如何調用的。
如果你要展示你的 INI 設置,只要在你的 MINFO() 中調用 DISPLAY_INI_ENTRIES() 宏即可。這個宏的解析看這里 ?display_ini_entries().
能觸發你的 MINFO() 鉤子的是下面這些:
調用用戶端的 phpinfo() 函數
php?-i 、 php-cgi?-i 、 php-fpm?-i 。或者更抽象的表述就是 ??-?i
php?--ri?或者用戶端的?ReflectionExtension::info()
注意:
要留意輸出的格式。如果你需要在 text 和 HTML 之間轉換格式,就研究一下 sapi_module.phpinfo_as_text 。你無法得知在用戶端擴展的信息是被如何調用的。
如果你要展示你的 INI 設置,只要在你的 MINFO() 中調用 DISPLAY_INI_ENTRIES() 宏即可。這個宏的解析看這里 ?display_ini_entries().
關于反射 API 的說明
反射大量使用你的zend_module_entry結構。例如,當你調用ReflectionExtension::getVersion()時,API 只會讀取zend_module_entry結構的版本字段。
與發現函數相同,你的zend_module_entry具有一個const struct _zend_function_entry * functions成員,該成員用于注冊PHP函數。
基本上,PHP 用戶區反射 API 只會讀取你的zend_module_entry結構并發布這些信息。它還可以使用你的module_number來收集在引擎的不同位置注冊的擴展的信息。例如,ReflectionExtension::getINIentries()?或?ReflectionExtension::getClasses()使用了這個。
本譯文僅用于學習和交流目的,轉載請務必注明文章譯者、出處、和本文鏈接
我們的翻譯工作遵照 CC 協議,如果我們的工作有侵犯到您的權益,請及時聯系我們。
總結
以上是生活随笔為你收集整理的php内核介绍及扩展开发指南,4.5. 发布扩展信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AutoCAD 2008中文版实用自学手
- 下一篇: 安徽IP地址段