Для добавления информации о расширении в вывод функции 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.
Вот эти функции:
char *php_info_html_esc(char *string TSRMLS_DC)
- Преобразует спец. символы в строкеstring
в соответствующие HTML сущности. Функция возвращает указатель на строку память под которую выделяется с помощьюemalloc()
и должна быть освобождена с помощью функцииefree()
void php_info_html_esc_write(char *string, int str_len)
- Функция аналогична функцииphp_info_html_esc()
, но в отличие от нее сразу выводит строку в выходной поток.string
- строка в которой спец. символы будут заменены на соответствующие HTML сущности.str_len
- длина строкиstring
void php_info_print_table_header(int num_cols, ...)
- выводит заголовок таблицы, пару <tr></tr> и пару <th></th> на каждую колонку, при выводе через SAPI веб-сервера. Первым параметромnum_cols
задается кол-во колонок, последующими - названия колонок.void php_info_print_table_colspan_header(int num_cols, char *header)
- выводит заголовок таблицы, при выводе через SAPI веб-сервера, но в отличие от функцииphp_info_print_table_header()
выводит всего лишь одну пару <th></th> с атрибутом объединения колонок colspan. Первым параметром задается кол-во объединяемых колонок (значение атрибутаcolspan
), вторым - название колонки.void php_info_print_table_row(int num_cols, ...)
- выводит строку с колонками пару <tr></tr> и пару <td></td> на каждую колонку, при выводе через SAPI веб-сервера. Первым параметромnum_cols
задается кол-во колонок, последующими - значение колонок. Если кол-во дополнительных параметров со значением колонок меньше, чем указанное кол-во колонок, то вместо недостающих значений будет выведен текст 'no value'.void php_info_print_table_row_ex(int num_cols, const char *class, ...)
- функция аналогична функцииphp_info_print_table_row()
, но в отличие от нее вторым параметром принимает название CSS класса колонки. Значение не распространяется на первую колонку, у нее всегда класс 'e'. При использовании функцииphp_info_print_table_row()
используется CSS класс 'v'.void php_info_print_table_start(void)
- выводит тег открытия таблицы, с необходимыми атрибутами, при выводе через SAPI веб-сервера, иначе пустую строку.void php_info_print_table_end(void)
- выводит тег закрытия таблицы, при выводе через SAPI веб-сервера, иначе ничего.void php_info_print_box_start(int bg)
выводит начало блока, который включает в себя вывод функцииphp_info_print_table_start()
и теги <tr><td> при выводе через SAPI веб-сервера. Если флагаbg
не равна нулю, то у колонки будет CSS класс 'h', иначе 'v'.void php_info_print_box_end(void)
- выводит конец блока, который включает в себя теги </td></tr> при выводе через SAPI веб-сервера и вывод функцииphp_info_print_table_end()
.void php_info_print_hr(void)
- выводит <hr />, при выводе через SAPI веб-сервера, иначе 31 символ нижнего подчеркивания '_' и символ новой строки '\n'
Пример вывода информации о модуле:
#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();
}