感觉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的函数呢?