与Nginx的处理流程有关。
Nginx中请求分阶段处理,逻辑在ngx_http_core_run_phases(r)中,每个阶段处理完成后转由下一个阶段处理。所以在rewrite_by_lua, access_by_lua中协程yield时需要调用ngx_http_core_run_phases(r)继续当前阶段的处理。
而content_by_lua, timer, ssl_cert_by_lua中,当前阶段处理完成后会结束请求,不需要转移到下一个阶段。直接调用相应的回调函数(如ngx_http_lua_sleep_handler)即可。
另外,log阶段是在ngx_http_finalize_request中调用的。
在 2017年3月25日星期六 UTC+8下午8:50:08,Alex写道:
Hi!
如题所述,在 ngx_http_lua_sleep_handler 函数(ngx_http_lua_sleep.c)中,有一段代码是这样的:
if (ctx->entered_content_phase) {
(void) ngx_http_lua_sleep_resume(r);
} else {
ctx->resume_handler = ngx_http_lua_sleep_resume;
ngx_http_core_run_phases(r);
}
我的问题是,这里为什么对于请求已经进入过 content_by_lua* 的情况作了区分?