Задержказапросов

Stanislav stan.sm at gmail.com
Wed Jul 25 10:23:47 MSD 2007


Здравствуйте,
У меня возникла необходимость задерживать обработку запросов клиентов (мне
нужно, чтобы с одного IP на fastcgi backend передавалось на обработку не более
одного запроса одновременно). Для этого, я так понял, мне нужно использовать
ngx_add_timer для задержки запросов, которые пришли в то время, когда уже другие
запросы с того IP обрабатывались. Я добавляю этот функционал в limit_zone_module
и у меня вобщем-то единственная проблема - как мне продолжить обработку запроса
в моём event handler'e ?
Есть мнение, что нужно продолжать вызов handler'ов со следующих фаз так, как это
реализовано в ngx_http_core_run_phases() - правильно ли это, или же есть
какой-то другой путь ? :)


Код:
----

void continue_processing(ngx_event_t *rev) {
	ngx_connection_t           *c;
	c = rev->data;
        // вот тут-то мне и нужно как-то продолжить обработку запроса
}

static ngx_int_t
ngx_http_limit_zone_handler(ngx_http_request_t *r)
{

  ...

  if( <some condition> ) {
    ngx_event_t	*rev;
    rev = ngx_pcalloc(r->pool, sizeof(ngx_event_t));
    ngx_memzero(rev, sizeof(ngx_event_t));
    rev->handler = continue_processing;
    rev->data = r->connection;
    ngx_add_timer(rev, 1000);
    return NGX_AGAIN;
  }
  
  ...

}






More information about the nginx-ru mailing list