Иногда возникает необходимость добавить Apache специфичную функциональность, и одним из вариантов решения данного вопроса является создание нового обработчика.
Подключенный к серверу, mod_perl предоставляет Perl-интерфейс к API Apache. Благодаря Perl-интерфейсу API Apache можно получить доступ к внутренней деятельности Apache из perl-скриптов.
Физически Apache Perl API представляет собой модуль, который работает под управлением mod_perl
- Apache.pm. Apache.pm и еще несколько модулей, включены в пакет поставки mod_perl.
Apache Perl API позволяет создавать обработчики Apache на Perl для любой фазы обработки запроса.
Создание обработчика
Внутренняя структура обработчика на perl представляет собой обычный модуль, со специальным методом внутри - sub handler.
Пример кода обработчика:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
package Apache::MyHandler; use strict; use Apache; use Apache::Constants qw(:common OK); sub handler { my $r = shift; ... return OK; } 1; |
Если метод обработчика имеет отличное от handler() - название, необходимо сделать соответствующие дополнения при конфигурировании сервера.
|
1 2 3 4 |
например PerlHandler Apache::MyHandler::not_standart_handler_name вместо PerlHandler Apache::MyHandler |
Для реализации взаимодействия с Apache подключаем основной модуль - Apache.pm, и дополнительные
(Apache::Constants, Apache::Connection, Apache::Server и т.д.) - по необходимости.
Согласно неофициальным стандартам, модуль создаваемого обработчика помещается в пространство имен Apache (package Apache::).
При вызове обработчика Apache передает ему информацию о текущей транзакции и конфигурации сервера, в виде ссылки на объект. Обработчик может манипулировать этими данными по своему усмотрению.
Согласно сложившимся традициям, ссылка на объект передается переменной, которую называют $r.
После завершения работы, метод handler должен вернуть серверу определенный статусный код. Для удобства работы с кодами можно использовать модуль Apache::Constants.
Запуск обработчика
Для задания perl-обработчика определенному этапу обработки запроса, в конфигурационном файле сервера (httpd.conf) используются директивы Perl*Handler. Название каждой директивы позволяет однозначно определить, для какой стадии обработки запроса назначен обработчик.
Директивы Perl*Handler предоставляются mod_perl, и не доступны на сервере, где mod_perl не установлен.
Список допустимых директив Perl*Handler:
- PerlChildInitHandler
- PerlPostReadRequestHandler
- PerlInitHandler
- PerlTransHandler
- PerlHeaderParserHandler
- PerlAccessHandler
- PerlAuthenHandler
- PerlAuthzHandler
- PerlTypeHandler
- PerlFixupHandler
- PerlHandler
- PerlLogHandler
- PerlCleanupHandler
- PerlChildExitHandler
Пример подключения обработчиков:
|
1 2 3 4 5 6 |
< Directory /home/aninatalie/aninatalie.ru/cgi> SetHandler perl-script PerlInitHandler Apache::StatINC PerlHandler Apache::Registry ... < / Directory> |
Обработчик perl-script, указанный директивой SetHandler, означает, что запросы к файлам каталога /home/aninatalie/aninatalie.ru/cgi будут обрабатываться с помощью mod_perl. Директива PerlInitHandler назначает обработчик Apache::StatINC для стадии запроса "Header parsing". Для стадии генерации содержимого и ответа клиенту, директивой PerlHandler назначается обработчик Apache::Registry.
Стоит отметить, что директивы Perl*Handler не обеспечивают автоматическую загрузку модуля обработчика. Для загрузки модуля необходимо предварительно использовать директиву PerlModule.