Учебник РНР
Назад Глава 32. Исходные Ресурсы. Обсуждение. Вперёд

Объявление блока Zend-модуля

Этот блок хранится в структуре zend_module_entry и содержит всю информацию, необходимую для описания содержимого этого модуля для Zend. Вы можете просмотреть внутреннее определение этого модуля в Листинге 9.6.

Рисунок 32-4. Внутреннее объявление zend_module_entry.
typedef struct _zend_module_entry zend_module_entry; struct _zend_module_entry { unsigned short size; unsigned int zend_api; unsigned char zend_debug; unsigned char zts; char *name; zend_function_entry *functions; int (*module_startup_func)(INIT_FUNC_ARGS); int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); int (*request_startup_func)(INIT_FUNC_ARGS); int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); char *version; int (*global_startup_func)(void); int (*global_shutdown_func)(void); [ Остальная часть этой структуры здесь не представляет интереса ] };

Вхождение Описание
size, zend_api, zend_debug и zts Обычно заполняется "STANDARD_MODULE_HEADER"'ом, который заполняет эти четыре члена размером всего zend_module_entry, ZEND_MODULE_API_NO, тем, построение это для отладки или нормальное (ZEND_DEBUG), и включён ли ZTS (USING_ZTS).
name Содержит имя модуля (например, "File functions", "Socket functions", "Crypt", etc.). Это имя показывается в phpinfo() в разделе "Additional Modules/Дополнительные Модули".
functions Указывает на блок Zend-функции, обсуждённый в предыдущем разделе.
module_startup_func Эта функция вызывается один раз при инициализации модуля и может использоваться для выполнения предшествующих шагов инициализации (таких как начальное выделение памяти и т.п.). Для указания на неудачу в ходе инициализации возвращается FAILURE; иначе - SUCCESS. Для маркировки этого поля как неиспользуемого/unused применяйте NULL. Для объявления функции используйте макрос ZEND_MINIT.
module_shutdown_func Эта функция вызывается один раз при выключения/shutdown модуля и может использоваться для выполнения предшествующих шагов деинициализации (таких как высвобождение памяти). Это пара к module_startup_func(). Для указания на неудачу в ходе инициализации возвращается FAILURE; иначе - SUCCESS. Для маркировки этого поля как неиспользуемого/unused применяйте NULL. Для объявления функции используйте макрос ZEND_MSHUTDOWN.
request_startup_func Эта функция вызывается при каждом запросе страницы и может использоваться для выполнения предшествующих шагов инициализации, необходимых для обработки запроса. Для указания на неудачу здесь возвращается FAILURE; иначе - SUCCESS. Примечание: Поскольку динамически загружаемые модули загружаются только при запросе страниц, функция старта запроса вызывается сразу после функции старта модуля/module startup (оба события инициализации возникают одновременно). Для маркировки этого поля как неиспользуемого/unused применяйте NULL. Для объявления функции используйте макрос ZEND_RINIT.
request_shutdown_func Эта функция вызывается один раз после каждого запроса страницы и работает как парная функция для request_startup_func(). Для указания на неудачу здесь возвращается FAILURE; иначе - SUCCESS. Примечание: Поскольку динамически загружаемые модули загружаются только при запросе страниц, после запроса shutdown-функции сразу идёт вызов обработчика отключения модуля (оба события деинициализации возникают одновременно). Для маркировки этого поля как неиспользуемого/unused применяйте NULL. Для объявления функции используйте макрос ZEND_RSHUTDOWN.
info_func Если phpinfo() вызывается в скрипте, Zend циклически проходит по всем загружаемым модулям и вызывает эту функцию. Затем каждый модуль имеет шанс оставить свой собственный "отпечаток" на странице вывода. Обычно это используется для дампа/dump информации окружения или статической информации. Для маркировки этого поля как неиспользуемого/unused применяйте NULL. Для объявления функции используйте макрос ZEND_MINFO.
version Версия модуля. Вы можете использовать NO_VERSION_YET, если пока не хотите задать номер версии модуля, но мы рекомендуем добавлять здесь строку версии. Такая строка может выглядеть примерно так (в хронологическом порядке): "2.5-dev", "2.5RC1", "2.5" или "2.5pl3".
global_startup_func Функции глобального старта используются редко. Вы обычно должны пропускать оставшуюся часть этой структуры, размещая макрос STANDARD_MODULE_PROPERTIES. Для маркировки этого поля как неиспользуемого/unused применяйте NULL. Для объявления функции используйте макрос ZEND_GINIT.
global_shutdown_func Для маркировки этого поля как неиспользуемого/unused применяйте NULL. Для объявления функции используйте макрос ZEND_GSHUTDOWN.
Остальные элементы структуры Они используются внутренне и могут быть заполнены с помощью макроса STANDARD_MODULE_PROPERTIES_EX. Вы не должны присваивать им какие-либо значения. Используйте STANDARD_MODULE_PROPERTIES_EX только тогда, когда используете startup и shutdown-функции; иначе используйте непосредственно STANDARD_MODULE_PROPERTIES.

В нашем примере эта структура реализуется так:

zend_module_entry firstmod_module_entry = { STANDARD_MODULE_HEADER, "First Module", firstmod_functions, NULL, NULL, NULL, NULL, NULL, NO_VERSION_YET, STANDARD_MODULE_PROPERTIES, };

В своей основе это простейший и минимальный набор значений, который вы можете использовать. Имя модуля устанавливается в First Module, затем делается ссылка на список функций, после чего все startup и shutdown-функции маркируются как неиспользуемые.

Для справочных целей вы можете найти список макросов, участвующих в объявлении startup и shutdown-функций, в Таблице 9.3. Они пока не используются в нашем базовом примере, но будут продемонстрированы позднее. Вы должны использовать эти макросы для объявления ваших startup и shutdown-функций, так как они требуют передачи специальных аргументов (INIT_FUNC_ARGS и SHUTDOWN_FUNC_ARGS), которые автоматически включаются в объявление функции, когда используются с предопределёнными макросами. Если вы объявляете вашу функцию самостоятельно, а PHP-разработчики решат, что необходимо изменение списка аргументов, вы должны будете изменить исходный код ваших модулей, чтобы обеспечить совместимость.

Таблица 32-5. Макросы для объявления Startup и Shutdown-функций
Макрос Описание
ZEND_MINIT(module) Объявление функции для старта модуля. Генерируемое имя будет zend_minit_<module> (например, zend_minit_first_module). Используется в сочетании с ZEND_MINIT_FUNCTION.
ZEND_MSHUTDOWN(module) Объявление функции для отключения модуля. Генерируемое имя будет zend_mshutdown_<module> (например, zend_mshutdown_first_module). Используется в сочетании с ZEND_MSHUTDOWN_FUNCTION.
ZEND_RINIT(module) Объявляет функцию для старта запроса. Генерируемое имя будет zend_rinit_<module> (например, zend_rinit_first_module ). Используется в сочетании с ZEND_RINIT_FUNCTION.
ZEND_RSHUTDOWN(module) Объявляет функцию для отключения запроса. Генерируемое имя будет zend_rshutdown_<module> (например, zend_rshutdown_first_module). Используется в сочетании с ZEND_RSHUTDOWN_FUNCTION.
ZEND_GINIT(module) Объявляет функцию для глобального старта. Генерируемое имя будет zend_ginit_<module> (например, zend_ginit_first_module). Используется в сочетании с ZEND_GINIT_FUNCTION.
ZEND_GSHUTDOWN(module) Объявляет функцию для глобального выключения. Генерируемое имя будет zend_gshutdown_<module> (например, zend_gshutdown_first_module). Используется в сочетании с ZEND_GSHUTDOWN_FUNCTION.
ZEND_MINFO(module) Объявляет функцию для печати информации модуля, используемой при вызове phpinfo() . Генерируемое имя будет zend_info_<module> (например, zend_info_first_module). Используется в сочетании с ZEND_MINFO_FUNCTION.

Назад Оглавление Вперёд
Объявление блока Zend-функций Вверх Создание get_module()