Рубрики
Uncategorized

Исследуйте принцип работы режима mod_php

Автор оригинала: David Wong.

1. Режим работы PHP и Apache

В традиционной архитектуре LAMP, когда PHP взаимодействует с Apache, существует по крайней мере два способа “запустить PHP”.:

  • Используйте CGI: Apache для отправки запроса на php -процесс cgi. Процесс php-cgi вызывает интерпретатор PHP, а затем интерпретирует код PHP-скрипта с помощью процесса интерпретатора PHP.
  • Использование mod_php в качестве модуля Apache: интерпретатор PHP как встроенный модуль Apache, то есть нет внешнего процесса PHP, но процесс Apache (модуль mod_php в Apache) интерпретирует и выполняет PHP-скрипт – это означает, что PHP взаимодействует с Apache более удобно и быстро.

“Запуск PHP” относится к вызову интерпретатора PHP для интерпретации и выполнения PHP-скрипта.

С помощью функции php’ ‘ php_sapi_name ()’мы можем узнать, какой режим работы использует текущая система. Если значение “apache2handler”, это означает: режим mod_php.

2. Принцип загрузки модуля Apache

Модули Apache могут быть скомпилированы в исполняемые программы статически или динамически загружаться во время работы Apache (в виде библиотек динамических ссылок). Это означает, что серверная программа Apache может быть расширена без ее перекомпиляции или даже перезапуска. Все, что нам нужно сделать, это отправить сигнал HUP или AP_SIG_GRACEFUL на сервер, чтобы сообщить серверу о необходимости перезагрузки модуля. Об отправке сигналов HUP в Apache:

“Отправка сигнала HUP или перезапуска родителю приводит к тому, что он убивает своих детей, как в ТЕРМИНЕ, но родитель не выходит. Он повторно считывает свои файлы конфигурации и повторно открывает все файлы журналов. Затем он порождает новый набор детей и продолжает подавать хиты.

Возвращаясь к модулю mod_php, Apache динамически загружает модуль:

  • Сначала добавьте в файл конфигурации Apache httpd.conf: LoadModule php 7_module libexec/apache2/libphp7.so, что означает файл библиотеки динамических ссылок, который загружает модуль PHP в запущенном процессе: libphp7.so.
  • Затем содержимое библиотеки динамических ссылок получается с помощью внутренних функций Apache (в виде Hook), а содержимое модуля PHP загружается в переменные, указанные в памяти.

В исходном коде PHP 7 структура данных модуля PHP (php 7_module) выглядит следующим образом: ‘

AP_MODULE_DECLARE_DATA module php7_module = {
     STANDARD20_MODULE_STUFF, /* macro, including the first eight fields of module structure: version number, minor version number, module index, module name, current module pointer, next dynamically loaded module pointer, magic number, rewrite_args function pointer.*/
     create_php_config,          /* create per-directory config structure */
     merge_php_config,          /* merge per-directory config structures */
     NULL,                         /* create per-server config structure */
     NULL,                         /* merge per-server config structures */
     php_dir_cmds,               /* command apr_table_t */
     php_ap2_register_hook     /* register hooks */
};

Где php_ap2_register_hook-это серия вызовов крючка:

void php_ap2_register_hook(apr_pool_t *p)
{
     ap_hook_pre_config(php_pre_config, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_post_config(php_apache_server_startup, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_handler(php_handler, NULL, NULL, APR_HOOK_MIDDLE);
#ifdef ZEND_SIGNALS
     ap_hook_child_init(zend_signal_init, NULL, NULL, APR_HOOK_MIDDLE);
#endif
     ap_hook_child_init(php_apache_child_init, NULL, NULL, APR_HOOK_MIDDLE);
}
  • Pre_config, post_config и child_in это крючки, которые выполняются при запуске, и они вызываются при запуске сервера Apache. Модуль интерпретатора PHP запускается в крюке post_config (реализован функцией php_apache_server_startup: “Sapi запускается вызовом sapi_startup, а структура модуля SAPI регистрируется вызовом php_apache2_startup (описано в начале этого раздела). Наконец, PHP инициализируется вызовом php_module_startup, который инициализирует механизм ZEND и заполняет zend_module_struct. Члены Treat_data в CT (через типы php_startup_sapi_content_types и т. Д.).
  • Обработчик-это хук, который выполняется при обработке запроса, и он будет вызван, когда сервер Apache обработает запрос.

3. Механизм зацепления Apache:

В Apache 2.4, если вам нужно обрабатывать запросы, вам просто нужно создать крюк (крюк), который прикреплен к обработчику запроса. Хук-это, по сути, сообщение, которое сообщает серверу, что он либо обслуживает запрос, инициированный пользователем, либо просто просматривает запрос. Все модули Apache (включая mod_rewrite, mod_authn_*, mod_proxy и т.д.) Подключены к определенным частям процесса запроса.

модули служат различным целям; некоторые из них являются обработчиками аутентификации/авторизации, другие-обработчиками файлов или сценариев, в то время как некоторые третьи модули переписывают URI или содержимое прокси-серверов.

Самому серверу Apache не нужно знать, за какую часть отвечает каждый модуль и с чем он имеет дело. Ему нужно только спросить, какой модуль заинтересован в запросе, когда приходит запрос клиента, и каждому модулю нужно только выбрать, хочет он этого или нет, если он хочет обработать его в соответствии с содержимым, определенным крючком, а затем вернуться к интерфейсу.

Изображение взято с официального сайта Apache.

Apache позволяет внешним модулям внедрять пользовательские функции в свой собственный цикл обработки запросов, тем самым участвуя в процессе обработки запросов Apache. С помощью механизма Hook модуль PHP может обрабатывать запросы на PHP-скрипты (т. е. интерпретировать и выполнять PHP-скрипты) в процессе обработки запросов Apache. Подробную реализацию можно увидеть в реализации крюка ap_hook_post_config Apache в исходном коде PHP: PHP регистрируется в крюке Apache модульным способом. Это позволяет загружать PHP-модули в виде динамических библиотек ссылок (libphp7.so файлы) для обработки запросов PHP всякий раз, когда есть запрос PHP во время выполнения процессов Apache.

РЕКОМЕНДАЦИИ

1、http://stackoverflow.com/ques… 2、http://www.phppan.com/2011/01… 3、https://github.com/php/php-sr… 4、https://github.com/php/php-sr… 5、https://httpd.apache.org/docs…