PHP로 확장 정보를 게시하는 방법

coldplay.xixi
풀어 주다: 2023-04-09 11:44:02
앞으로
1726명이 탐색했습니다.

사전 게시 확장 扩 확장은 phpinfo () 에 대한 정보를 게시하거나 API 요구 사항을 반영할 수 있습니다. 살펴 보겠습니다. PHP로 확장 정보를 게시하는 방법

이 장은 정말 간단하기 때문에 그리 길지는 않을 것입니다.

관련 학습 권장사항: 초보부터 마스터까지 PHP 프로그래밍

MINFO() 후크

phpinfo() 或反射API要求的信息。我们一起来看一下。

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

相关学习推荐:PHP编程从入门到精通

MINFO( ) 挂钩

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

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

注意

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

下面是一个简单的 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 关闭 */
    NULL, /* Request 初始化 */
    NULL, /* Request 关闭 */
    PHP_MINFO(pib), /* Module information */
    "0.1", /* 扩展的版本号写在这里 */
    STANDARD_MODULE_PROPERTIES
};
로그인 후 복사

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 -iphp-cgi -iphp-fpm -i 。或者更抽象的表述就是  <sapi_binary> - i</sapi_binary>
  • php --ri 或者用户端的 ReflectionExtension::info()

注意:

要留意输出的格式。如果你需要在 text 和 HTML 之间转换格式,就研究一下 sapi_module.phpinfo_as_text 。你无法得知在用户端扩展的信息是被如何调用的。

如果你要展示你的 INI 设置,只要在你的 MINFO() 中调用 DISPLAY_INI_ENTRIES() 宏即可。这个宏的解析看这里  display_ini_entries().

能触发你的 MINFO() 钩子的是下面这些:

  • 调用用户端的 phpinfo() 函数
  • php -iphp-cgi -iphp-fpm -i 。或者更抽象的表述就是  <sapi_binary> - i</sapi_binary>
  • 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선언되면 선언된 MINFO() 후크에서 모든 일이 발생합니다. 선언하지 않으면 엔진은 기본 기능을 실행하여 확장에 대한 정보를 인쇄합니다. 이 함수는 확장 버전과 최종 선언된 INI 항목만 인쇄합니다.

🎜이 프로세스에 참여하려면 확장 구조에서 MINFO() 후크를 선언해야 합니다. 🎜

참고

🎜모든 일은 읽을 수 있는 ext/standard/info.c에서 발생합니다. 엔진은 php_info_print_module()을 호출하여 PHP 확장에 대한 정보를 인쇄합니다. 🎜🎜다음은 간단한 MINFO() 사례입니다: 🎜rrreee🎜PHP로 확장 정보를 게시하는 방법🎜🎜가장 중요한 일은 php_info_print_*()를 처리하는 것입니다. 생성된 출력 스트림에 정보를 인쇄할 수 있는 API입니다. 일부 원시 정보를 인쇄하려면 간단한 php_write()로 충분합니다. php_write()는 SAPI 출력 스트림의 매개변수로 전달한 정보를 처리하며 php_info_print_*() API는 동일하지만 필요에 따라 형식이 지정됩니다. 이전에 HTML 형식을 원할 경우 HTML의 table-tr-td🎜 태그를 사용하면 됩니다. HTML로 형식을 지정할 필요가 없으면 간단히 공백을 사용하여 구분하면 됩니다. 🎜🎜보시다시피, php_info_print_*() API를 도입하려면 ext/standard/info.h🎜를 포함해야 하고, php/main/도 포함해야 합니다. SAPI.h🎜를 사용하여 sapi_module 기호를 가져옵니다. 이 기호는 전역적이며 현재 PHP 프로세스에서 사용되는 SAPI🎜를 나타냅니다. phpinfo_as_text 필드는 php-fpm🎜과 같은 "웹" SAPI를 작성할 것인지, 아니면 php-cli🎜(SAPI)과 같은 "텍스트"를 작성할 것인지 알려줍니다. 🎜🎜 MINFO() 후크를 트리거할 수 있는 것은 다음과 같습니다: 🎜
  • 클라이언트의 phpinfo() 함수 호출
  • php -i, php-cgi -i, php-fpm -i. 또는 보다 추상적인 표현은 <sapi_binary> - i</sapi_binary>
  • php --ri 또는 클라이언트의 ReflectionExtension::info()
🎜참고: 🎜🎜출력 형식에 주의하세요. 텍스트와 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</sapi_binary>
  • php --ri 또는 클라이언트의 ReflectionExtension::info()
🎜참고: 🎜🎜출력 형식에 주의하세요. 텍스트와 HTML 간 변환이 필요한 경우 sapi_module.phpinfo_as_text를 살펴보세요. 클라이언트 측의 확장 정보가 어떻게 호출되는지 알 수 있는 방법이 없습니다. 🎜
🎜INI 설정을 표시하려면 MINFO()에서 DISPLAY_INI_ENTRIES() 매크로를 호출하세요. 이 매크로에 대한 분석은 display_ini_entries()를 참조하세요.🎜

리플렉션 API에 대한 지침

🎜Reflection은 zend_module_entry 구조를 광범위하게 사용합니다. 예를 들어 ReflectionExtension::getVersion()을 호출하면 API는 zend_module_entry 구조의 버전 필드만 읽습니다. 🎜🎜함수 검색과 마찬가지로 zend_module_entry에는 PHP 함수를 등록하는 데 사용되는 const struct _zend_function_entry * 함수 멤버가 있습니다. 🎜

기본적으로 PHP 사용자 영역 리플렉션 API는 이를 사용하여 zend_module_entry结构并发布这些信息。它还可以使用你的module_number来收集在引擎的不同位置注册的扩展的信息。例如,ReflectionExtension::getINIentries() 或 ReflectionExtension::getClasses()읽기만 합니다.

위 내용은 PHP로 확장 정보를 게시하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
php
원천:learnku.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!