1.向客户端响应时,查询本地是否有缓存
ngx_http_upstream_init_request--->ngx_http_upstream_cache-->ngx_http_file_cache_open--->ngx_http_upstream_cache_send--->ngx_http_cache_send
可以参考http://blog.itpub.net/15480802/viewspace-1421409/
2.从上游获取到数据后,缓存到本地
主要是在ngx_event_pipe-->ngx_event_pipe_write_to_downstream这个函数中完成,如果判断是可缓存的,发送给客户端后,再调用ngx_write_chain_to_temp_file写入临时文件,当数据获取完整时,将临时文件重新命名为缓存文件,重命名操作在ngx_http_upstream_process_request调用ngx_http_file_cache_update中完成
3.程序启动load
主要处理函数是ngx_http_file_cache_loader,
4.cache 管理
主要处理函数是ngx_http_file_cache_manager
以上两个接口是在读配置时,ngx_http_file_cache_set_slot函数中初始化
nginx启动时,调用ngx_start_cache_manager_processes启动缓存相关的load和 manager进程,进程处理函数为ngx_cache_manager_process_cycle
ngx_cache_manager_ctx_t对应的结构分别为ngx_cache_manager_ctx、ngx_cache_loader_ctx,ngx_cache_manager_process_cycle中执行ev.handler = ctx->handler,就是将ngx_cache_manager_ctx-->ngx_cache_loader_process_handler、ngx_cache_loader_ctx--->ngx_cache_manager_process_handler分别赋值给事件handler,使用定时器来触发事件,下面是两个handler的代码
static void
ngx_cache_manager_process_handler(ngx_event_t *ev)
{
time_t next, n;
ngx_uint_t i;
ngx_path_t **path;
next = 60 * 60;
path = ngx_cycle->pathes.elts;
for (i = 0; i < ngx_cycle->pathes.nelts; i++) {
if (path[i]->manager) {
/*调用ngx_http_file_cache_manager*/
n = path[i]->manager(path[i]->data);
next = (n <= next) ? n : next;
ngx_time_update();
}
}
if (next == 0) {
next = 1;
}
ngx_add_timer(ev, next * 1000);
}
static void
ngx_cache_loader_process_handler(ngx_event_t *ev)
{
ngx_uint_t i;
ngx_path_t **path;
ngx_cycle_t *cycle;
cycle = (ngx_cycle_t *) ngx_cycle;
path = cycle->pathes.elts;
for (i = 0; i < cycle->pathes.nelts; i++) {
if (ngx_terminate || ngx_quit) {
break;
}
/*调用ngx_http_file_cache_loader*/
if (path[i]->loader) {
path[i]->loader(path[i]->data);
ngx_time_update();
}
}
exit(0);
}