异想天开

What's the true meaning of light, Could you tell me why

nginx定时器实现以及使用

日期:2014-05-22 17:28:46
  
最后更新日期:2014-05-25 15:00:48
1.实现
nginx将定时器封装成定时事件,为快速查询选用红黑树作为其存储结构,那么定时事件是如何触发呢?在linux环境下,nginx一般阻塞于epoll_wait函数。超时时限可以设置成距离最近那个定时事件的间隔,这样即使没有网络io事件情况下,epoll_wait也能及时返回执行定时事件。nginx还有另外一种方式,利用系统alarm函数发送signal,epoll_wait会中断返回执行定时事件。 关键词:
全局变量:
[code lang="cpp"]
ngx_thread_volatile ngx_rbtree_t ngx_event_timer_rbtree;
static ngx_rbtree_node_t ngx_event_timer_sentinel;
[/code]

初始化函数:
[code lang="cpp"]
ngx_int_t ngx_event_timer_init(ngx_log_t *log);
[/code]

定时事件处理函数:
[code lang="cpp"]
void ngx_event_expire_timers();
[/code]

2.使用方式
若要添加定时器,设置好ev的handler,ngx_add_timer添加。
[code lang="cpp"]
static ngx_event_t ev;
ngx_memzero(&ev_cleanup,sizeof(ngx_event_t));
ev.handler = ngx_print_timer;
ngx_add_timer(&ev,1000);
[/code]

3.在模块什么地方添加定时器?
添加定时器需要在worker_process的定时器初始化后,比如在模块create_loc回调函数设置定时器就不会起作用,因为那时定时器还没完成初始化。
demo module:
https://github.com/acjog/nginx/tree/master/add_timer_demo