您好,欢迎访问一九零五行业门户网

一步步领悟 CGI FastCGI PHP-FPM 的真正奥义

cgi 模型 cgi 是外部应用程序( cgi 程序)与 web 服务器之间的接口标准,是在 cgi 程序和 web 服务器之间传递信息的规程。
图片来源 http://mengkang.net/491.html cgi 核心就是其定义的环境变量。
server_name:运行cgi序为机器名或ip地址。server_interface:www服务器的类型,如:cern型或ncsa型。server_protocol:通信协议,应当是http/1.0。server_port:tcp端口,一般说来web端口是80。http_accept:http定义的浏览器能够接受的数据类型。http_referer:发送表单的文件url。(并非所有的浏览器都传送这一变量)http_user-agent:发送表单的浏览的有关信息。getway_interface:cgi程序的版本,在unix下为 cgi/1.1。path_translated:path_info中包含的实际路径名。path_info:浏览器用get方式发送数据时的附加路径。script_name:cgi程序的路径名。query_string:表单输入的数据,url中问号后的内容。remote_host:发送程序的主机名,不能确定该值。remote_addr:发送程序的机器的ip地址。remote_user:发送程序的人名。content_type:post发送,一般为application/xwww-form-urlencoded。content_length:post方法输入的数据的字节数。
web 服务器在接受请求之后对这些环境变量赋值,然后创建一个子进程,在子进程中 cgi 程序通过这些环境变量取值。这个过程就是对 cgi 接口的实现。
举个例子以 c 为 web 服务器,php 作为 cgi 程序。
1. web 启动 socket 监听之后,接受到一个客户端的请求
get /cgi-demo.php?a=b&c=d http/1.1host: localhost:9003connection: keep-aliveaccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8upgrade-insecure-requests: 1user-agent: mozilla/5.0 (macintosh; intel mac os x 10_10_0) applewebkit/537.36 (khtml, like gecko) chrome/47.0.2526.106 safari/537.36accept-encoding: gzip, deflate, sdchaccept-language: zh-cn,zh;q=0.8,en;q=0.6,zh-tw;q=0.4,ja;q=0.2
2. web 服务器就可以给环境变量赋值了
request_method getquery_string a=b&c=dscript_name /cgi-demo.phpserver_protocol http/1.1server_name localhostserver_port 9003
3. cgi 程序解析获取这些环境变量
#include #include #include int main(){ putenv(query_string=a=b&c=d); int pid = fork(); if (pid == 0) { system(php cgi-demo.php); } return 0;}
cgi-demo.php 则在子进程中获取到 web 服务器在父进程设置的环境变量
上面这两段代码仅仅是演示 web 服务器和 cgi 程序对 cgi 接口的实现,对数据的输入输出都省略没写。完整的web 服务器 + cgi 程序demo 可以参考 http://mengkang.net/491.html
fastcgi 模型
fastcgi 的核心则是取缔传统的 fork-and-execute 方式,减少每次启动的巨大开销,以常驻的方式来处理请求。区别于传统的 cgi 是执行脚本从环境变量中换取 cgi 接口定义的值,而 fastcgi 则又多了一层 socket 服务的交互,web 服务器需要将 cgi 接口数据封装在遵循 fastcgi 协议包中发送给 fastcgi 解析器程序。正式因为 fastcgi 进程管理器是基于 socket 的,所以也是分布式的,所以 web 服务器和 cgi 程序可以分布部署。
coding...
php-fpm coding...
大概的介绍可以看 http://www.php-internals.com/book/?p=chapt02/02-02-03-fastcgi
fastcgi协议规范 http://www.fastcgi.com/devkit/doc/fcgi-spec.html
http://andylin02.iteye.com/blog/648412 (中文版)
fastcgi 进程管理器的 php 简单实现 http://my.oschina.net/goal/blog/196599
其它类似信息

推荐信息