1 定义
ngx_http_core_run_phases 函数 定义在 ./nginx-1.24.0/src/http/ngx_http_core_module.c
voidngx_http_core_run_phases(ngx_http_request_t*r){ngx_int_trc;ngx_http_phase_handler_t*ph;ngx_http_core_main_conf_t*cmcf;cmcf=ngx_http_get_module_main_conf(r,ngx_http_core_module);ph=cmcf->phase_engine.handlers;while(ph[r->phase_handler].checker){rc=ph[r->phase_handler].checker(r,&ph[r->phase_handler]);if(rc==NGX_OK){return;}}}
ngx_http_core_run_phases 函数 是 Nginx HTTP 请求的阶段引擎驱动器。 它依据请求的 `phase_handler` 索引, 循环调用预置的阶段检查器(checker)函数, 依次执行各处理阶段,直到所有阶段完成, 或在某个阶段需要异步等待时暂停并返回, 从而实现可随时挂起与恢复的非阻塞处理流程。
2 详解
1 函数签名
voidngx_http_core_run_phases(ngx_http_request_t*r)
返回值 该函数不返回任何值
参数 ngx_http_request_t *r 指向当前 HTTP 请求结构体的指针
2 逻辑流程
1 局部变量 2 遍历各阶段并调用其 checker
1 局部变量
{ngx_int_trc;ngx_http_phase_handler_t*ph;ngx_http_core_main_conf_t*cmcf;
2 遍历各阶段并调用其 checker
cmcf=ngx_http_get_module_main_conf(r,ngx_http_core_module);
从请求的 main 配置中提取 ngx_http_core_module 的配置结构
ph=cmcf->phase_engine.handlers;
取得阶段处理器数组
while(ph[r->phase_handler].checker){rc=ph[r->phase_handler].checker(r,&ph[r->phase_handler]);if(rc==NGX_OK){return;}}}
进入阶段处理循环
r->phase_handler 是 ngx_http_request_t 结构体内的一个 整数索引 它的作用是为 HTTP 请求的 阶段处理引擎 记录当前正在执行或下一次该执行的处理器位置。 就像程序计数器,精准记录了请求在阶段流水线中的执行进度 当某个阶段需要异步等待 此时 r->phase_handler 保持原值不变,引擎函数 return。 之后,当异步条件满足时,事件循环会重新调用引擎(通常仍为 ngx_http_core_run_phases), 它会从 r->phase_handler 记录的索引处继续执行,从而实现无阻塞的状态恢复。
ph[r->phase_handler].checker 中的 checker 是 阶段检查器/调度器函数指针 它的职责是: 调用实际的 handler 根据 handler 的返回值进行阶段推进决策: NGX_OK:递增 r->phase_handler,使流程进入下一个处理器或下一个阶段 handler:由各模块实现,专注于业务逻辑 checker:由框架提供,专注于 流程控制。 它将 handler 的返回码翻译成阶段引擎的动作, 实现了业务逻辑与调度逻辑的解耦。
循环条件:只要 checker 不为 NULL,就表示还有阶段待处理。 当索引移动到数组末尾的哨兵项时,其 checker 为 NULL,循环自动退出, 此时所有阶段已执行完毕(但最终请求的关闭由其他机制触发)。
调用当前阶段的 checker
checker 返回的 NGX_OK 表示 “当前请求已被本阶段完整处理或成功接管,后续所有 HTTP 阶段无需再执行。”
NGX_OK — 操作已顺利执行,请求未完成 表示请求需要挂起等待 请求仍处于活动状态,尚未最终结束。它期望调用者继续后续处理逻辑。 NGX_DONE — 请求处理已完全终结 请求处理完毕,已调用 ngx_http_finalize_request 或类似函数终结了请求 请求对象已经进入销毁流程