Nginx中的超时定时器,以及在修改缓存行为中的应用

在接下来的工作中,我可能要用到Nginx中的超时定时器。当客户端请求的资源正在更新时,我希望该连接等待一段时间。

首先,我得认真地学习一下基础知识。相关文章链接如下:

(1)http://lenky.info/2011/09/09/nginx%E7%9A%84%E8%B6%85%E6%97%B6%E5%A4%84%E7%90%86/#_edn1

(2)http://blog.dccmx.com/?p=537

对于每一个连到Nginx的用户,我希望能够有一个自定义的事件字段,这样可以实现在延时一段时间后,调用某一函数的功能。

(1)相关数据结构

a. 基础结构

在ngx_event.h中,

struct ngx_event_s {

……

ngx_event_handler_pt hanlder;//这里保存事件的回调函数

//typedef void (*ngx_event_handler_pt)(ngx_event_t *ev)

…….

}

在ngx_connection.h中,

struct ngx_connection_s {

……

ngx_event_t *my_delay_ev;//加入一个自定义的字段

        int                    my_delay_count;//对于delay的次数进行计数

}

b. 对于每一个连接,可以通过如下方式获得此字段:

r -> connection -> my_delay_ev;

c. 将延时事件与连接绑定

ev -> data = r->connection;//通过ngx_event_t的data指针来记录链接的地址

d.通过事件获取连接

ngx_connection_t      *c;

ngx_http_request_t    *r;

c = ev->data;

r = c->data;

e. 事件的初始化。

在HTTP请求刚到来时,就应该使my_delay_ev指针指向一个实际的数据结构,同时令my_delay_count = 0;

初始化位置如下:

在ngx_http_request.c的ngx_http_init_request中,

加入:

ngx_event_t     *my_delay_ev;

r->connection->my_delay_ev = ngx_palloc(r->pool,sizeof(ngx_event_t));

my_delay_ev = r -> connection -> my_delay_ev;

my_delay_ev ->data = r -> connection;

r->connection->my_delay_count = 0;

(2)  为事件设置定时。

ngx_event_t *ev;

ev = ngx_palloc(r->pool,sizeof(ngx_event_t));

ev->data = …

ev->handler= …//这里设置到时后需要回调函数

ev->timer_set=0;//这个一定要设置,否则,这里的数值是随机的。如果该值非零

                                    //ngx_event_add_timer函数会先在超时树中删除该事件结点。可这个节点

                                     //并不在树中,于是就会出现段错误!

 

(3)事件插入函数:将事件插入红黑树,timer表示多少秒后超时。

ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer);