FastCGI初始:php
http://www.cnblogs.com/JohnABC/p/3529786.html html
PHP中fastcgi的实现:web
一、开启一个socket监听服务
api
fcgi_fd=fcgi_listen();服务器
完成socket、bind、listen三步app
二、初始化请求对象socket
fcgi_init_request(&request,fcgi_fd);
ide
struct fcgi_request{php-fpm
int listen_socket;
spa
int fd,
int id;
int keep;
int closed;
int in_len;
int in_pad;
HashTable* env;
};
三、建立多个CGI解释器子进程
这里子进程的个数默认是0,从配置文件中读取设置到环境变量,而后在程序中读取,而后建立指定数目的子进程来等待处理 Web 服务器的请求。
四、在子进程中接收请求
fcgi_accept_request(&request);
而且把request放入全局变量sapi_globals.server_context,这点很重要,方便了在其余地方对请求的调用。
五、读取数据
fcgi_read_request(fcgi_request* req);
六、执行脚本
七、结束请求
fcgi_finish_requests(&request,1);
消息头
对于fastcgi这种数据收发协议来讲,它所发送的每次请求或是回复都有一个可提取的公共部分就是FCGI_Header(请求头),及无论每次发送的是什么消息,都必须会有一个以下格式的请求头
typedef struct {
unsigned char version; //版本 unsigned char type; //操做类型 unsigned char requestIdB1; //请求id unsigned char requestIdB0; unsigned char contentLengthB1; //内容长度 unsigned char contentLengthB0;
unsigned char paddingLength; //填充字节的长度 unsigned char reserved; //保留字节
}FCGI_Header;
消息体
一、type为1
开始请求
typedef struct {
unsigned char roleB1; //web服务器所指望php-fpm扮演的角色,具体取值下面有 unsigned char roleB0;
unsigned char flags; //肯定php-fpm处理完一次请求以后是否关闭 unsigned char reserved[5]; //保留字段
}FCGI_BeginRequestBody;
roleB0=1 是最经常使用的值,php-fpm接受咱们的http所关联的信息,并产生个响应
flags 肯定是否与php-fpm创建长链接,为1长链接,为0则在每次请求处理结束以后关闭链接
二、type为3
结束请求
typedef struct {
unsigned char appStatusB3; //结束状态,0为正常 unsigned char appStatusB2;
unsigned char appStatusB1;
unsigned char appStatusB0;
unsigned char protocolStatus; //协议状态 unsigned char reserved[3]; }FCGI_EndRequestBody;
appStatus 共4个字节,用来表示结束状态,0为正常结束
protocolStatus 为协议所处的状态,0为正常状态
三、type为4
typedef struct {
unsigned char nameLengthB3; /* nameLengthB0 >> 7 == 0 */ unsigned char nameLengthB2;
unsigned char nameLengthB1;
unsigned char nameLengthB0;
unsigned char valueLengthB3; /* nameLengthB0 >> 7 == 0 */ unsigned char valueLengthB2;
unsigned char valueLengthB1;
unsigned char valueLengthB0;
unsigned char nameData[(B3 & 0x7f) << 24) + (B2 << 16) + (B1 << 8) + B0];
unsigned char valueData[valueLength((B3 & 0x7f) << 24) + (B2 << 16) + (B1 << 8) + B0]; } FCGI_NameValue;
nameLength 占用4字节,用来讲明name的长度
valueLength 4个字节,用来讲明value的长度
前8个字节以后紧跟的为nameLength长度的name值,接着是valueLength长度的value值
当消息为输入,输出,错误时,它的消息头以后便直接跟具体数据
完整消息record
fastcgi将一个完整的消息称为record,咱们每次发送的单位就是record。经过上面的介绍,咱们能够总结出常见的记录格式
type值 | record |
---|---|
1 | header(消息头) + 开始请求体(8字节) |
3 | header + 结束请求体(8字节) |
4 | header + name-value长度(8字节) + 具体的name-value |
5,6,7 | header + 具体内容 |
http://ms.csdn.net/share/5EB5472B0837D27DEB083BA97982ED2F_1_IPHONE_APP
http://blog.csdn.net/Shreck66/article/details/50355729
《完》