当前位置: 首页 > news >正文

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

相关文章:

  • 8.12 矢量图层面要素单一符号使用五(栅格数据填充)
  • 用自己的数据集训练TimeSformer并转ONNX用c++推理
  • 2024广东省职业技能大赛云计算赛项实战——容器云平台搭建
  • python watchdog 配置文件热更新
  • BP神经网络的反向传播(Back Propagation)
  • 方法区讲解
  • EasyExcel 导出批注信息
  • 【Go】十四、图形验证码、短信验证码、注册接口与redis的简单使用
  • 单片机练习题3
  • 每日优秀影视分享❗❗
  • WPF文本绑定显示格式StringFormat设置-特殊格式时间日期和多数据绑定
  • 原生dom操作快速写入html渲染(insertAdjacentHTML)
  • Cadence:Conformal系列形式验证工具
  • 深入解析Netty的Reactor模型及其实现:详解与代码示例
  • Pikachu靶场--XSS
  • [NodeJS] 关于Buffer
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • CAP 一致性协议及应用解析
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Less 日常用法
  • REST架构的思考
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • vue-router的history模式发布配置
  • Zepto.js源码学习之二
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 今年的LC3大会没了?
  • 手机端车牌号码键盘的vue组件
  • 云大使推广中的常见热门问题
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 阿里云移动端播放器高级功能介绍
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​Java基础复习笔记 第16章:网络编程
  • # .NET Framework中使用命名管道进行进程间通信
  • #includecmath
  • $forceUpdate()函数
  • (1)(1.13) SiK无线电高级配置(五)
  • (arch)linux 转换文件编码格式
  • (C语言)二分查找 超详细
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (LeetCode C++)盛最多水的容器
  • (poj1.3.2)1791(构造法模拟)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • .Net CF下精确的计时器
  • .Net 基于IIS部署blazor webassembly或WebApi
  • .NET开发人员必知的八个网站
  • /etc/fstab 只读无法修改的解决办法
  • :“Failed to access IIS metabase”解决方法
  • @WebServiceClient注解,wsdlLocation 可配置
  • [145] 二叉树的后序遍历 js
  • [20161101]rman备份与数据文件变化7.txt
  • [Android Pro] Notification的使用