antonio's blog

antonio's blog


Блог о всяком разном, связанном с разработкой ПО. Пишу редко, когда есть время и желание.

Anton Dobkin
Author

Share


Tags


Разработка расширений для PHP. Информация о расширении

Anton DobkinAnton Dobkin

Для добавления информации о расширении в вывод функции phpinfo() (или php -i в CLI), необходимо определить функцию MINFO с помощью макроса PHP_MINFO_FUNCTION:

PHP_MINFO_FUNCTION(ext_name) {  
  ...
}

Эта функция будет вызвана автоматически при вызове, из пользовательского пространства, функции phpinfo() или при выполнении команды php -i из командной строки.

После определения ее необходимо зарегистрировать в структуре zend_module_entry с помощью макроса PHP_MINFO:

zend_module_entry ext_name_module_entry = {  
   STANDARD_MODULE_HEADER,
   ...
   PHP_MINFO(ext_name),
   ...
   STANDARD_MODULE_PROPERTIES
};

где ext_name - название расширения.

Макросы PHP_MINFO_FUNCTION и PHP_MINFO объявлены в заголовочном файле main/php.h и являются алиасами для макросов ZEND_MODULE_INFO_D и ZEND_MODULE_INFO_N.

Макросы в качестве параметра принимают название расширения.

Макросы ZEND_MODULE_INFO_D и ZEND_MODULE_INFO_N объявлены в заголовочном файле Zend/zend_API.h:

#define ZEND_MODULE_INFO_N(module) zm_info_##module
...
#define ZEND_MODULE_INFO_D(module) void ZEND_MODULE_INFO_N(module)(ZEND_MODULE_INFO_FUNC_ARGS)

Как видно из определения макросов, код

PHP_MINFO_FUNCTION(ext_name) {  
...
}

будет развернут препроцессором компилятора:

void zm_info_ext_name(end_module_entry *zend_module TSRMLS_DC) {  
...
}

Для вывода информации о модуле, в функции MINFO, могу быть использованы функции PHPWRITE() и php_printf(). Однако стоит отметить,что при выводе информации с помощью этих функций вы должны позаботиться о том, чтобы информация была отображена корректно в зависимости от того, ожидает ли текущий SAPI простой текста или HTML. Для определения этого достаточно проанализировать флаг phpinfo_as_text глобальной структуры sapi_module:

PHP_MINFO_FUNCTION(ext_name) {  
    ...
    if (sapi_module.phpinfo_as_text) {
      /* простой текст */ 
    } else {
      /* HTML текст */
    }
    ...
}

Также для вывода информации можно использовать функции-обвертки семейства phpinfo*(), выводимая информация будет автоматически обвернута в HTML-теги при выводе через SAPI веб-сервера (например, CGI, IIS, Apache), иначе, при использовании интерфейса командной строки, информация будет выведена в выде простого текста. Функции определены в стандартном модуле ext/standart и объявлены в заголовочном файле ext/standart/info.h.

Вот эти функции:

Пример вывода информации о модуле:

#define EXTENSION_VERSION "0.3"
#define COPYRIGHT "2011 Anton Dobkin"

//...

PHP_MINFO_FUNCTION(dwavd) {  
    php_info_print_table_start();
    if (sapi_module.phpinfo_as_text) {
        php_info_print_table_colspan_header(2, "(c) "COPYRIGHT);
    } else {
        php_info_print_table_colspan_header(2, "(C) "COPYRIGHT);
    }
    php_info_print_table_end();
    php_info_print_table_start();
    php_info_print_table_row(2, "Extension Version", EXTENSION_VERSION);
    php_info_print_table_row(2, "Version of Library", LIBRARY_VERSION);
   php_info_print_table_end();
}
Anton Dobkin
Author

Anton Dobkin

Comments