本文主要是介绍nginx的rev->handler的更新历程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
感觉nginx很强大,但是代码命令的确有提升的地方。整个nginx的数据处理都是靠rev驱动的,而且rev->handler也是在不停地变更来实现数据的处理的。
首先是在ngx_event_process_init()中
rev->handler = (c->type == SOCK_STREAM) ? ngx_event_accept | ngx_event_recvmsg;
然后在ngx_event_recvmsg()中调用ngx_stream_init_connection()
ls->handler(c);//ngx_stream_init_connection()
进而在ngx_stream_init_connection()中调用ngx_stream_init_connection()
rev->handler = ngx_stream_session_handler;
。。。。
rev->handler(rev);
最后在ngx_stream_session_handler()中调用了ngx_stream_core_run_phases(s)
291 void 292 ngx_stream_session_handler(ngx_event_t *rev) 293 { 294 ngx_connection_t *c; 295 ngx_stream_session_t *s; 296
✗ 297 c = rev->data;
✗ 298 s = c->data; 299 300 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, 301 "{%s:%d}: before",__FUNCTION__,__LINE__); 302 ngx_stream_core_run_phases(s); 303 ngx_log_debug2(NGX_LOG_DEBUG_STREAM, s->connection->log, 0, 304 "{%s:%d}: after",__FUNCTION__,__LINE__); 305 }
你以为到这里就结束了吗?并不是的。在NGX_STREAM_CONTENT_PHASE阶段有一次修改rev->handler的机会。
static void ngx_stream_udplog_handler(ngx_stream_session_t *s){
.....c->read->handler = ngx_stream_puma_block_reading;
.....
}
一直不太懂,这里为啥要赋值为一个read block的函数呢?
这篇关于nginx的rev->handler的更新历程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!