首页 > Web开发 > 详细

PHP中的FastCGI初识

时间:2017-07-30 23:21:04      阅读:335      评论:0      收藏:0      [点我收藏+]

FastCGI初始:

http://www.cnblogs.com/JohnABC/p/3529786.html



PHP中fastcgi的实现:


1、开启一个socket监听服务

    fcgi_fd=fcgi_listen();

    完成socket、bind、listen三步


2、初始化请求对象

    fcgi_init_request(&request,fcgi_fd);

    struct fcgi_request{

        int listen_socket;

        int fd,

        int id;

        int keep;

        int closed;

        

        int in_len;

        int in_pad;


        HashTable* env;

    };


3、创建多个CGI解释器子进程

    这里子进程的个数默认是0,从配置文件中读取设置到环境变量,然后在程序中读取,然后创建指定数目的子进程来等待处理 Web 服务器的请求。


4、在子进程中接收请求

    fcgi_accept_request(&request);

    并且把request放入全局变量sapi_globals.server_context,这点很重要,方便了在其他地方对请求的调用。


5、读取数据

    fcgi_read_request(fcgi_request* req);


6、执行脚本


7、结束请求

    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;


消息体

1、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则在每次请求处理结束之后关闭连接 

2、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为正常状态 

3、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值

4、type值为5,6,7

当消息为输入,输出,错误时,它的消息头之后便直接跟具体数据

完整消息record

fastcgi将一个完整的消息称为record,我们每次发送的单位就是record。通过上面的介绍,我们可以总结出常见的记录格式

type值record
1header(消息头) + 开始请求体(8字节)
3header + 结束请求体(8字节)
4header + name-value长度(8字节) + 具体的name-value
5,6,7header + 具体内容


http://ms.csdn.net/share/5EB5472B0837D27DEB083BA97982ED2F_1_IPHONE_APP

http://blog.csdn.net/Shreck66/article/details/50355729


《完》

本文出自 “零蛋蛋” 博客,谢绝转载!

PHP中的FastCGI初识

原文:http://lingdandan.blog.51cto.com/10697032/1952090

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!