Хуки жизненного цикла
PHP предоставляет несколько событий жизненного цикла, которые могу использоваться расширениями для выполнения общих задач инициализации или для выполнения задач по завершению работы. В большинстве случаев, хуки предоставляемые Zephir являются достаточной мерой, чтобы охватить большинство настроек и проделать всю работу, в которой может нуждаться ваше расширение. Однако, если вы обнаружите, что вам нужно сделать что-то большее, есть несколько опций, которые вы можете использовать для того, чтобы передать произвольные инструкции в те же хуки, которые использует Zephir.
Рассмотрим следующую диаграмму:
Хуки жизненного цикла регистрируются в файле config.json
. Как видно из диаграммы выше, есть четыре типа хуков — globals
, initializers
, destructors
и info
. Каждый из этих типов имеет свою собственную секцию конфигурации на корневом уровне общих настроек расширения. Типам globals и info посвящены отдельные главы. А в этой главе описывается настройка двух других хуков жизненного цикла.
Описание каждого хука в файле config.json
является массивом объектов, каждый из которых, в свою очередь, по существу состоит из пары include
и code
. Значение в поле include
указывает на заголовочный файл, который может использоваться кодом, предоставленным в поле code
. Содержимое поля code
, как не трудно догадаться, является Си-кодом, который будет исполняться. Технически вы могли бы поместить сюда более одной строки кода, однако так поступать крайне не рекомендуется. Вместо этого, рекомендуется размещать большие части кода в отдельных файлах (описанных в поле include
) и использовать однострочный стиль вызова этих функций в поле code
.
initializers
Типичный блок initializers
выглядит примерно так:
{
"initializers": [
{
"globals": [
{
"include": "my/awesome/library.h",
"code": "setup_globals_deps(TSRMLS_C)"
}
],
"module": [
{
"include": "my/awesome/library.h",
"code": "setup_module_deps(TSRMLS_C)"
}
],
"request": [
{
"include": "my/awesome/library.h",
"code": "some_c_function(TSRMLS_C)"
},
{
"include": "my/awful/library.h",
"code": "some_other_c_function(TSRMLS_C)"
}
]
}
]
}
Этот блок отвечает за определение хуков в Init событиях, показанных на диаграмме выше. Вот три из них: globals
для настройки глобальных переменных, module
для настройки чего угодно, в чём может нуждаться само расширение, и request
для настройки обработки расширением одиночного запроса.
destructors
Типичный блок destructors
выглядит так:
{
"destructors": [
{
"request": [
{
"include": "my/awesome/library.h",
"code": "c_function_for_shutting_down(TSRMLS_C)"
},
{
"include": "my/awful/library.h",
"code": "some_other_c_function_than_the_other_ones(TSRMLS_C)"
}
],
"post-request": [
{
"include": "my/awesome/library.h",
"code": "c_function_for_cleaning_up_after_the_response_is_sent(TSRMLS_C)"
}
],
"module": [
{
"include": "my/awesome/library.h",
"code": "release_module_deps(TSRMLS_C)"
}
],
"globals": [
{
"include": "my/awesome/library.h",
"code": "release_globals_deps(TSRMLS_C)"
}
]
}
]
}
Схожим образом, как и блок initializers
, этот блок отвечает за определение хуков в событиях, предоставленных на диаграмме выше. Однако его предназначение — Shutdown события. Четыре события, которые могут быть описаны в этом блоке: request
— для финализации любых данных перед отправкой ответа клиенту, post-request
— для очистки после отправки ответа, module
— для очистки самого расширения до завершения работы PHP, и гglobals
— для очистки окружения глобальных переменных.