<-
Apache > HTTP Server > Documentation > Version 2.0 > Developer Documentation

Apacheские 2.0 Функции Крюка

предупреждение

этот документ находится все еще в развитии и может быть частично устаревшим.

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

top

Creating a hook function

чтобы создавать новый крюк, четыре вещи должны быть сделаны:

Declare the hook function

использование AP_DECLARE_HOOK макро-, которому нужно дать тип возвращения функции крюка, название крюка, и аргументов. Например, если крюк возвращается int и берет a request_rec * и int и называется do_something , затем объявите это как это:

AP_DECLARE_HOOK(int, do_something, (request_rec *r, int n))

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

Create the hook structure

каждый исходный файл, который экспортирует крюк, имеет частную структуру, которая используется, чтобы сделать запись функций модуля, которые используют крюк. Это объявлено следующим образом:

APR_HOOK_STRUCT(
APR_HOOK_LINK(do_something)
...
)

Implement the hook caller

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

Call the hook callers

в соответствующие моменты в кодексе, назовите вызывающего крюка, как так:

int n, ret;
request_rec *r;

ret=ap_run_do_something(r, n);

top

Hooking the hook

модуль, который хочет, чтобы крюк был назван потребностями сделать две вещи.

Implement the hook function

включить соответствующий удар головой, и определить статическую функцию правильного типа:

static int my_something_doer(request_rec *r, int n)
{
...
return OK;
}

Add a hook registering function

в течение инициализации, 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 */
};

Controlling hook calling order

в примере выше, мы не использовали эти три аргумента в регистрационной функции крюка тот контроль, называющий заказ. Есть два механизма для того, чтобы делать это. Первое, довольно сырой, метод, позволяет нам определять примерно, куда крюком управляют относительно других модулей. Заключительный аргумент управляет этим. Есть три возможных ценности: 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