转载请务必在文章最开头标明原文地址
本文原创地址:博客园骏马金龙https://www.cnblogs.com/f-ck-need-u/p/7627035.html
什么是CGI
CGI是一种规范(协议),按照CGI规范编写的程序称为CGI脚本。CGI脚本能处理客户端发来的动态请求并返回响应。
CGI的工作方式
cgi_workflow.png
Http服务器(例如:Apache Http服务器)只能处理静态页面请求。(静态页面是指没有与用户交互的元素的页面,一般扩展名为.htm或.html)
Http服务器可以使用CGI协议向CGI脚本发送来自客户端的动态请求,CGI脚本处理完后把结果(一般是生成的html页面)发回给服务器,最终服务器再把结果发到客户端。
CGI脚本
任何一种语言都能编写CGI脚本。只要这种语言具有标准输入、输出和环境变量。Perl、PHP、Shell等都是常见的编写CGI程序的语言。
关于CGI的重要概念
以下用PHP为例子说明:
- cgi/fastcgi:都是协议。fastcgi是cgi的优化
- php-cgi:fastcgi协议的实现
- php-fmp:是php-cgi的进程管理器
- cgi进程/线程:在php上,就是php-cgi进程/线程。专门用于接收web server的动态请求,调用并初始化zend虚拟机
-
zend虚拟机:对php文件做词法分析、语法分析、编译成opcode,并执行。最后关闭zend虚拟机。
php-fpm.png
php-cgi.png
web server和CGI的交互模式
web server对cgi进程/线程来说,它的作用就是发起动态处理请求,传递一些参数和环境变量,最后接收cgi的返回结果。
- cgi模式:web server每次收到动态请求就新建一个cgi进程
- 动态模块模式:将php-cgi的模块(例如php5_module)编译进httpd。在httpd启动时会加载模块,加载时也将对应的模块激活,php-cgi也就启动了。
- php-fpm模式:使用php-fpm管理php-cgi,此时httpd不再控制php-cgi进程的启动。可以将php-fpm独立运行在非web服务器上,实现所谓的动静分离。