当前位置:首页 > PHP教程 > php应用 > 列表

php如何发布扩展信息

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-18 16:48:38 浏览: 评论:0 

扩展可以发布 phpinfo() 或反射API要求的信息。我们一起来看一下。

本章不会太长,因为真的很简单。

MINFO( ) 挂钩

如果声明了,一切都在声明的 MINFO() 挂钩中进行。如果未声明,则引擎将运行默认功能以打印有关扩展名的信息。该功能只会打印扩展程序的版本以及最终声明的 INI条目 。

如果要加入此过程,则必须在扩展结构中声明一个 MINFO() hook。

注意:

一切都在 ext / standard / info.c 中进行,您可以阅读该文件,引擎通过调用 php_info_print_module() 来打印有关PHP扩展的信息

下面是一个简单的 MINFO() 案例:

  1. #include "php/main/SAPI.h" 
  2.  
  3. #include "ext/standard/info.h" 
  4.  
  5.  
  6.  
  7. #define PIB_TXT  "PHPInternalsBook Authors" 
  8.  
  9. #define PIB_HTML "<h3>" PIB_TXT "</h3>" 
  10.  
  11.  
  12.  
  13. PHP_MINFO_FUNCTION(pib) 
  14.  
  15.  
  16.     time_t t; 
  17.  
  18.     char cur_time[32]; 
  19.  
  20.  
  21.  
  22.     time(&t); 
  23.  
  24.     php_asctime_r(localtime(&t), cur_time); 
  25.  
  26.  
  27.  
  28.     php_info_print_table_start(); 
  29.  
  30.         php_info_print_table_colspan_header(2, "PHPInternalsBook"); 
  31.  
  32.         php_info_print_table_row(2, "Current time", cur_time); 
  33.  
  34.     php_info_print_table_end(); 
  35.  
  36.  
  37.  
  38.     php_info_print_box_start(0); 
  39.  
  40.         if (!sapi_module.phpinfo_as_text) { 
  41.  
  42.             php_write(PIB_HTML, strlen(PIB_HTML)); 
  43.  
  44.         } else { 
  45.  
  46.             php_write(PIB_TXT, strlen(PIB_TXT)); 
  47.  
  48.         } 
  49.  
  50.     php_info_print_box_end(); 
  51.  
  52.  
  53.  
  54.  
  55. zend_module_entry pib_module_entry = { 
  56.  
  57.     STANDARD_MODULE_HEADER, 
  58.  
  59.     "pib"
  60.  
  61.     NULL, /* Function 入口 */ 
  62.  
  63.     NULL, /* Module 初始化 */ 
  64.  
  65.     NULL, /* Module 关闭 */ 
  66.  
  67.     NULL, /* Request 初始化 */ 
  68.  
  69.     NULL, /* Request 关闭 */ 
  70.  
  71.     PHP_MINFO(pib), /* Module information */ 
  72.  
  73.     "0.1"/* 扩展的版本号写在这里 */ 
  74.  
  75.     STANDARD_MODULE_PROPERTIES 
  76.  
  77. }; 

php如何发布扩展信息

你要做的主要是处理 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 。或者更抽象的表述就是 <SAPI_binary> - 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 。或者更抽象的表述就是 <SAPI_binary> - 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()使用了这个。

Tags: php如何发布扩展信息

分享到: