分享

一步步领悟 CGI FastCGI PHP

 昵称28748685 2016-02-03

CGI 模型

CGI 是外部应用程序( CGI 程序)与 Web 服务器之间的接口标准,是在 CGI 程序和 Web 服务器之间传递信息的规程。

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

图片来源 http:///491.html

CGI 核心就是其定义的环境变量。

  1. SERVER_NAME:运行CGI序为机器名或IP地址。
  2. SERVER_INTERFACE:WWW服务器的类型,如:CERN型或NCSA型。
  3. SERVER_PROTOCOL:通信协议,应当是HTTP/1.0。
  4. SERVER_PORT:TCP端口,一般说来web端口是80。
  5. HTTP_ACCEPT:HTTP定义的浏览器能够接受的数据类型。
  6. HTTP_REFERER:发送表单的文件URL。(并非所有的浏览器都传送这一变量)
  7. HTTP_USER-AGENT:发送表单的浏览的有关信息。
  8. GETWAY_INTERFACE:CGI程序的版本,在UNIX下为 CGI/1.1。
  9. PATH_TRANSLATED:PATH_INFO中包含的实际路径名。
  10. PATH_INFO:浏览器用GET方式发送数据时的附加路径。
  11. SCRIPT_NAME:CGI程序的路径名。
  12. QUERY_STRING:表单输入的数据,URL中问号后的内容。
  13. REMOTE_HOST:发送程序的主机名,不能确定该值。
  14. REMOTE_ADDR:发送程序的机器的IP地址。
  15. REMOTE_USER:发送程序的人名。
  16. CONTENT_TYPE:POST发送,一般为application/xwww-form-urlencoded
  17. CONTENT_LENGTH:POST方法输入的数据的字节数。

Web 服务器在接受请求之后对这些环境变量赋值,然后创建一个子进程,在子进程中 CGI 程序通过这些环境变量取值。这个过程就是对 CGI 接口的实现。

举个例子以 C 为 Web 服务器,PHP 作为 CGI 程序。

1. Web 启动 Socket 监听之后,接受到一个客户端的请求

  1. GET /cgi-demo.php?a=b&c=d HTTP/1.1
  2. Host: localhost:9003
  3. Connection: keep-alive
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
  5. Upgrade-Insecure-Requests: 1
  6. User-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.36
  7. Accept-Encoding: gzip, deflate, sdch
  8. Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,ja;q=0.2

2.  Web 服务器就可以给环境变量赋值了

  1. REQUEST_METHOD          GET
  2. QUERY_STRING            a=b&c=d
  3. SCRIPT_NAME             /cgi-demo.php
  4. SERVER_PROTOCOL         HTTP/1.1
  5. SERVER_NAME             localhost
  6. SERVER_PORT            9003

3. CGI 程序解析获取这些环境变量

  1. #include 
  2. #include 
  3. #include 
  4.  
  5. int main()
  6. {
  7.    putenv('QUERY_STRING=a=b&c=d');
  8.  
  9.    int pid = fork();
  10.  
  11.    if (pid == 0)
  12.    {
  13.          system('php cgi-demo.php');
  14.    }
  15.  
  16.    return 0;
  17. }

cgi-demo.php则在子进程中获取到 web 服务器在父进程设置的环境变量

  1. <>
  2. printf('QUERY_STRING:%s\n'getenv('QUERY_STRING'));

上面这两段代码仅仅是演示 Web 服务器和 CGI 程序对 CGI 接口的实现,对数据的输入输出都省略没写。完整的Web 服务器 + CGI 程序demo 可以参考 http:///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./book/?p=chapt02/02-02-03-fastcgi

FastCGI协议规范

http://www./devkit/doc/fcgi-spec.html

http://andylin02./blog/648412 (中文版)

FastCGI 进程管理器的 PHP 简单实现

http://my.oschina.net/goal/blog/196599



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多