Хуки жизненного цикла

PHP предоставляет несколько событий жизненного цикла, которые могу использоваться расширениями для выполнения общих задач инициализации или для выполнения задач по завершению работы. В большинстве случаев, хуки предоставляемые Zephir являются достаточной мерой, чтобы охватить большинство настроек и проделать всю работу, в которой может нуждаться ваше расширение. Однако, если вы обнаружите, что вам нужно сделать что-то большее, есть несколько опций, которые вы можете использовать для того, чтобы передать произвольные инструкции в те же хуки, которые использует Zephir.

Рассмотрим следующую диаграмму:

Жизненный цикл PHP

Хуки жизненного цикла регистрируются в файле 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 — для очистки окружения глобальных переменных.