变量:
process_rec,a structure that represents one process。
struct process_rec { apr_pool_t *pool; //全局池 apr_pool_t *pconf; //配置池 int argc; //参数个数 const char * const *argv; //参数 const char *short_name; };//表示进程的数据结构
apr_pool_t:基本池类型
1: AP_MONCONTROL(0); 代码剖析控制
2: process = init_process(&argc, &argc); //进程初始化,process代表主进程信息。
3: apr_pool_create(&pcommands, pglobal);
apr_pool_tag(pcommands, "pcommands");
pcommands --> 命令行参数池
4: error = ap_setup_prelinked_modules(process); //将所有预连接的模块加入到加载模块链表中。
5: ap_run_rewrite_args(process);
rewrite_args是为MPM模块设置的,允许MPM模块对命令行中的传入参数进行重写。
6: 参数处理
apr_getopt_t *opt;
apr_getopt_init(&opt, pcommands, process->argc, process->argv);
处理参数传入opt。
while((rv=apr_getopt(opt, AP_SERVER_BASEARGS, &c, &optarg)) == APR_SUCCESS) {
char **new;
switch(c) {
case 'c':
}
}
7: apr_pool_create(&plog, pglobal);
apr_pool_tag(plog, "plog");
内存池,内存池树
8: ap_replace_stderr_log(process->pool, temp_error_log);
输出日志文件替换。
9: 读取配置
server_conf = ap_read_config(process, ptemp, confname, &ap_conftree);
解析成配置树。
10: ap_run_pre_config(pconf, plog, ptemp);
触发模块的pre_config挂钩,是模块可以修改配置树。
11: ap_process_config_tree
处理配置树。
12: signal_server = APR_RETRIEVE_OPTIONAL_FN(ap_signal_server);
ap_run_post_config(pconf, plog, ptemp, server_conf);
13: for(;;) 主循环
请求处理被分割为多个挂钩阶段,每个阶段实现一个特定的任务,开发人员注册挂钩。Apache会自动执行所有挂钩函数。