Apache Версия 2.0 Сервера HTTP
этот документ находится все еще в развитии и может быть частично устаревшим.
вообще, функция крюка - тот, который Apache назовет в некоторый момент в течение обработки запроса. Модули могут обеспечить функции, которые называют, и определяет, когда их называют по сравнению с другими модулями.
чтобы создавать новый крюк, четыре вещи должны быть сделаны:
использование
AP_DECLARE_HOOK
макро-, которому нужно дать тип возвращения функции крюка, название крюка, и аргументов. Например, если крюк возвращается
int
и берет a
request_rec *
и
int
и называется
do_something
, затем объявите это как это:
AP_DECLARE_HOOK(int, do_something, (request_rec *r, int n))
это должно войти в удар головой, который будут включать модули, если они хотят использовать крюк.
каждый исходный файл, который экспортирует крюк, имеет частную структуру, которая используется, чтобы сделать запись функций модуля, которые используют крюк. Это объявлено следующим образом:
APR_HOOK_STRUCT(
APR_HOOK_LINK(do_something)
...
)
исходный файл, который экспортирует крюк, должен осуществить функцию, которая назовет крюк. Есть в настоящее время три возможных способа сделать это. Во всех случаях, называют функцию запроса
ap_run_
hookname
()
.
если ценность возвращения крюка
void
, тогда все крюки называют, и вызывающий осуществлен как это:
AP_IMPLEMENT_HOOK_VOID(do_something, (request_rec *r, int n), (r, n))
вторые и третьи аргументы - фиктивная декларация аргумента и фиктивные аргументы, поскольку они будут использоваться, называя крюк. Другими словами, этот макрос расширяется кое к чему как это:
void ap_run_do_something(request_rec *r, int n)
{
...
do_something(r, n);
}
если крюк возвращает ценность, то этим можно или управлять до первого крюка, который делает кое-что интересное, как так:
AP_IMPLEMENT_HOOK_RUN_FIRST(int, do_something, (request_rec *r, int n), (r, n), DECLINED)
первый крюк, который делает
нет
возвратитесь
DECLINED
останавливает петлю, и ее ценность возвращения возвращена от вызывающего крюка. Отметьте это
DECLINED
является возвращением крюка Apacheа традиции, означающим, что "я не делал ничего", но это могут быть любые иски Вы.
альтернативно, всеми крюками можно управлять, пока ошибка не происходит. Это сводится к разрешению два возвратить ценности, одна изо что означает, "что я сделал кое-что, и было в порядке" и другое значение, "я не сделал ничего". Первая функция, которая возвращает ценность кроме одной из тех двух остановок петля, и ее возвращение, - ценность возвращения. Объявите, что они любят так:
AP_IMPLEMENT_HOOK_RUN_ALL(int, do_something, (request_rec *r, int n), (r, n), OK, DECLINED)
снова,
OK
и
DECLINED
являются традиционными ценностями. Вы можете использовать то, что Вы хотите.
в соответствующие моменты в кодексе, назовите вызывающего крюка, как так:
int n, ret;
request_rec *r;
ret=ap_run_do_something(r, n);
модуль, который хочет, чтобы крюк был назван потребностями сделать две вещи.
включить соответствующий удар головой, и определить статическую функцию правильного типа:
static int my_something_doer(request_rec *r, int n)
{
...
return OK;
}
в течение инициализации, Apache назовет каждый крюк модулей, регистрирующий функцию, которая включена в структуру модуля:
static void my_register_hooks()
{
ap_hook_do_something(my_something_doer, NULL, NULL, HOOK_MIDDLE);
}
mode MODULE_VAR_EXPORT my_module =
{
...
my_register_hooks /* register hooks */
};
в примере выше, мы не использовали эти три аргумента в регистрационной функции крюка тот контроль, называющий заказ. Есть два механизма для того, чтобы делать это. Первое, довольно сырой, метод, позволяет нам определять примерно, куда крюком управляют относительно других модулей. Заключительный аргумент управляет этим. Есть три возможных ценности:
HOOK_FIRST
,
HOOK_MIDDLE
и
HOOK_LAST
.
всеми модулями, используя любую специфическую ценность можно управлять в любом заказе друг относительно друга, но, конечно, всего использования модулей
HOOK_FIRST
будет управляться прежде
HOOK_MIDDLE
которые являются прежде
HOOK_LAST
. модули, которые не заботятся, когда ими управляют, должны использовать
HOOK_MIDDLE
.
(я растягивал их так, люди могли сделать материал как
HOOK_FIRST-2
чтобы входить немного ранее, но действительно ли это мудро? - Бен)
отметить, что есть еще две ценности,
HOOK_REALLY_FIRST
и
HOOK_REALLY_LAST
. они должны только использоваться экспортером крюка.
другой метод позволяет более прекрасный контроль. Когда модуль знает, что этим нужно управлять, прежде (или после) некоторые другие модули, это может определить их по имени. Второй (третий) аргумент - ПУСТОЕ-ЗАКОНЧЕННОЕ множество верениц, состоящих из названий модулей, которыми нужно управлять прежде, чем (после того, как) текущего модуля. Например, предположите, что мы хотим, чтобы "mod_xyz.c" и "mod_abc.c" бежал прежде, чем мы делаем, тогда мы завербовали бы следующим образом:
static void register_hooks()
{
static const char * const aszPre[] = { "mod_xyz.c", "mod_abc.c", NULL };
ap_hook_do_something(my_something_doer, aszPre, NULL, HOOK_MIDDLE);
}
отметить, что вид имел обыкновение достигать, это устойчиво, настолько заказывающее установленный
HOOK_
ORDER
сохранен, в максимально возможной степени.
Бен Лори , 15-ого августа 1999