Учебник РНР
НазадГлава 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()