|
Этот блок хранится в структуре 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. |
| |