测试小站: 处理网 回收帮 培训网 富贵论坛 老富贵论坛

Aapche开发经验

  Apache简介

  Apache是强大的Web服务器,它的性能远超微软的IIS服务器软件。它也是典型的网络服务软件,是开发其它网络服务软件的最佳参考模型。

  Apache的2个主要版本1.3和2.0,用它开发过商业软件产品,翻译过它的大量英语资料,经常在Apache的开发邮件列表里查找相关知识点,欢迎对此开源代码进行学习合作和开发合作。

  Apache研究成绩

  Apache的主要研究成果点有:

  1、多任务服务器架构(进程管理)

  2、request_rec结构的常用成员变量

  3、Apache父子进程通信

  4、头信息(header)数据说明

  5、MIME信息说明

  6、配置和系统宏

  7、记分牌

  8、核心静态文件传送

  核心静态文件传送

  这里列出核心静态文件传送的流程描述,以资借鉴。

  判断长度是否大于4096,如果大于4096则清0小长度发送计数(长度小于等于4096的发送调用计数,是静态全局变量);如果不大于4096,则小长度发送计数加1。

  如果读长度小于4096 {

  如果socket连接有效,则维持读取发送循环:

  读取4096个字节数据

  开始发送循环,如果连接有效且没有发送完4096个数据:

  发送4096个字节的数据

  发送循环结束

  读取发送循环结束

  }

  else {

  如果socket连接有效,则维持读取发送循环:

  读取12*1450个字节数据

  开始发送循环,如果连接有效且没有发送完12*1450个数据:

  利用socket的api来判断TCP的底层发送缓冲中有没有数据如有循环等待;

  循环发送6*1450个字节的数据

  发送循环结束

  读取发送循环结束

  }

  如果小长度发送计数大于4,则清0计数,并休眠1毫秒。

  request_rec

  request_rec结构包括一些指针,这些指针指向:服务器完成请求处理后将会清除的资源池,包含每个服务器与每个连接信息的结构,以及更加重要的请求自身信息的结构。

  这些当中最重要的信息是一小套描述被请求对象属性的字符串,包括它的URI、文件名、 内容类型与编码(这些信息由处理该请求的转换和类型检查处理器分别填入)。其它经常用到的数据项是一些表,给出了客户端原生请求的MIME头、 准备回送的响应中的MIME头(模块们可以随意加入) 和为向请求提供服务过程中产生的子处理过程提供的环境变量。 这些表用ap_table_get和ap_table_set例程来处理。注意Content-type头的值不能被模块的内容处理器使用 ap_table_*()例程来设置。而是通过把request_rec结构中的 content_type字段指向一个适合的字符串来设置。例如,r->content_type="text/html"; 最后,还有指向两个数据结构的指针,依次来说,一个是指向每模块配置结构。 具体地,这结构拥有指向这样一些数据结构的指针: 有模块创建来描述自身是如何被配置在给定的目录(通过htaccess文件 或部分)中工作的; 以及在为请求提供服务的过程中建立的私有数据(因此模块中处理各段的处 理器能够传送一些“注解”给负责另一个阶段的处理器)。另有一个server_rec 数据结构中的配置向量,也由request_rec指向, 包含着每个(包括虚拟)服务器的配置数据。

  这里是一个简化的声明,给出了最常用的成员变量:

  struct request_rec {

  pool *pool;

  conn_rec *connection;

  server_rec *server;

  /* 请求的是什么对象 */

  char *uri;

  char *filename;

  char *path_info;

  char *args; /* 查询参数,如果有的话 */

  struct stat finfo; /* 由服务器核心设置;

  * 如果不存在这样的文件,st_mode设为零 */

  char *content_type;

  char *content_encoding;

  /* MIME头环境,输入和输出。同时也是一个存放传递

  * 给子处理过程的环境变量的数组,因此可以

  * 写模块来加入一些东西到环境中去。

  ** headers_out和err_headers_out的区别是

  * 后者即使出错时也被输出并持续通过内部重定向传递

  * (因此为错误文档处理器输出的头信息将会包含它们)。

  */

  table *headers_in;

  table *headers_out;

  table *err_headers_out;

  table *subprocess_env;

  /* 关于请求自身的信息 */

  int header_only; /* 头请求,相对于GET */

  char *protocol; /* 协议, 或者由客户请求给出,或者是HTTP/0.9 */

  char *method; /* GET, HEAD, POST, 等等 */

  int method_number; /* M_GET, M_POST, 等等 */

  /* 日志信息 */

  char *the_request;

  int bytes_sent;

  /* 一个模块可以设置的标志,用于显示返回的

  * 信息是不是易变所以客户端不应该缓存它。

  */

  int no_cache;

  /* 各种跟随.htaccess文件变化的其他配置信息

  * 这些是对于每个模块都有一个无类型指针的配置向量

  * (具体指向的东西由各模块决定)。

  */

  void *per_dir_config; /* 配置文件中设置的选项,等等 */

  void *request_config; /* 针对*这个*请求本身的专门信息 */

  };

  大多数request_rec结构是通过读取客户端的HTTP请求并填充各个域建立起来的

posted @ 2021-12-21 14:11  linjingyg  阅读(51)  评论(0)    收藏  举报