CGI,FastCGI与PHP
CGI
什么是CGI
CGI(Common Gateway Interface)是一个标准协议,它为web服务器提供了一个标准的协议,以便于服务器可以像运行命令行接口程序那样来运行第三方程序,这些第三方程序可以动态地生成web页面。这些第三方程序被称为CGI脚本(满足CGI定义的程序),或者简称CGIs。至于这些CGI程序是如何被执行的则是由服务器决定的。在一般情况下,CGI脚本在接收到web请求能动态地生成HTML。
为什么会有CGI
正如浏览器会将请求信息发送给web服务器,web服务器在需要CGI程序时也会将一些必要的信息传递给CGI程序。相应的,当CGI程序运行完后也需要将一些信息返回给web服务器,这些信息包括了http相应中的一些内容,例如:当前请求的响应状态,返回的内容类型(e.g. HTML, PDF, or plain text)等等。
在很早之前,不同的web服务器会使用不同的方法去跟CGI程序交换信息,这使得CGI程序的通用性不强(根据不同的web服务器需要相应的修改CGI程序)。因此CGI诞生了,它定义了一些通用的方法的来规范web服务器和CGI程序之间的信息交流。早期CGI程序主要被用来处理HTML表单。
webserver与CGI程序的连接
在web服务器中往往可以配置哪些url需要被CGI程序来处理。这通常是通过规定服务器某些目录是属于CGI程序的(这个目录对应着某种形式的url,例如“http://example.com/cgi-bin/pr...”这个url对应着cgi-bin这个目录,因此服务器知道这个请求需要被CGI程序来处理)
web服务器通过将必要的信息存储在环境变量中,而CGI程序则从环境变量中获取这些必要信息,因此可以实现二者之间的信息交换。CGI程序处理完后,原本发送到“标准输出”的信息会被转到web服务器,服务器再将结果返回给客户端。
以下这些参数大多是CGI标准规定,需要由web服务器传递给CGI程序的(通过前面所说的“环境变量”的方式):
Server specific variables:SERVER_SOFTWARE: HTTP服务器的 name/versionSERVER_NAME: 服务器的主机名(也可以是IP地址)GATEWAY_INTERFACE: CGI/version.
Request specific variables:SERVER_PROTOCOL: HTTP/version.SERVER_PORT: TCP 端口.REQUEST_METHOD: HTTP请求方式(GET,POST等).PATH_INFO: 路径后缀PATH_TRANSLATED: 如果PATH_INFO存在的话,该参数代表相应的在服务器上的绝对路径。SCRIPT_NAME: 相应的到程序的路径(例如/cgi-bin/script.cgi)QUERY_STRING: URL中“?”后后面接着的那部分。这些请求字符串(query string)通常以“name=value”的形式出现(例如var1=val1&var2=val2...)REMOTE_HOST: 客户端的主机名REMOTE_ADDR: 客户端的ip地址。AUTH_TYPE: 认证类型(如果可用的话)REMOTE_USER :与AUTH_TYPE相关REMOTE_IDENT: see ident, only if server performed such lookup.CONTENT_TYPE: Internet media type of input data if PUT or POST method are used, as provided via HTTP header.CONTENT_LENGTH: similarly, size of input data (decimal, in octets) if provided via HTTP header.其他与user agent相关的参数(通常就是浏览器) :HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGE, HTTP_USER_AGENT, HTTP_COOKIE
CGI的缺点
每次请求都要启动一个CGI程序,相对于一次请求处理,启动过程的性能消耗占整个过程的消耗比例不小,因此如果每次请求都需要启动一个新的CGI程序来处理,明显在性能上是低效的。
CGI的替代方案
由于上面提到的CGI的缺点,出现了以下这些替代方案:
- fastCGI(“prefork”预生成);
- 模块化,直接在web服务器中运行相应的程序来实现动态生成html(例如apache的mod_php);
- 使用预编译的CGI程序(即编译型语言);
- Java的servlet
FastCGI & php-fpm
什么是FastCGI
FastCGI是在CGI标准协议上发展出来的一个变种协议,它的主要目标是减轻web服务器与CGI程序之间交互时的负载,这样一台服务器就可以在同一时间处理更多的web请求。
FastCGI的实现细节
与CGI每次处理一个请求时都启动一个新的CGI程序不同,FastCGI使用一些常驻内存的CGI进程来处理源源不断的请求。这些CGI进程是由FastCGI管理进程(FastCGI server)来管理,而非web服务器。当接收到一个web请求时,web服务器把一些必要的信息和页面请求本身通过Unix域套接字( Unix domain socket),或命名管道(named pipe ),或TCP连接( TCP connection)发送给FastCGI进程(至于发给哪个CGI进程则是由FastCGI管理进程来分配)。通过相同的连接方式,web响应返回给web服务器。响应返回后,本次连接可能会被关闭掉,但是web服务器和这些处理请求的CGI进程会继续驻留在内存中,等待处理下一个请求。因此,每一个CGI进程在它的生命周期内可以处理很多个web请求,而不是像CGI那样只能处理一个web请求。
什么是php-fpm
PHP-FPM (FastCGI Process Manager)是FastCGI在PHP上的具体实现,从PHP5.3.3开始,已经被集成到PHP的安装包中。
Apache与php的连接
- CGI(基本已经不用)
- 模块化(mod_php)
- FastCGI
具体配置可以参考:
https://segmentfault.com/q/10...
http://php.net/manual/en/inst...
nginx与php的连接方式
通常使用FastCGI方式
具体配置参考
https://segmentfault.com/a/11...
http://php.net/manual/en/inst...
参考文献
https://en.wikipedia.org/wiki...
https://en.wikipedia.org/wiki...
https://en.wikipedia.org/wiki...
http://php.net/manual/en/inst...
CGI,FastCGI与PHP相关推荐
- Nginx + CGI/FastCGI + C/Cpp
http://www.cnblogs.com/skynet/p/4173450.html Nginx + CGI/FastCGI + C/Cpp 2014-12-19 11:05 by 吴秦, 197 ...
- Nginx + CGI/FastCGI + C/Cpp(编不过去,不搞了。。。)(Common Gateway Interface)
Nginx + CGI/FastCGI + C/Cpp 文章目录 1.CGI 1.1.环境变量 1.2.标准输入 总结:CGI使外部程序与Web服务器之间交互成为可能.CGI程式运行在独立的进程中,并 ...
- 漫谈CGI FastCGI WSGI
作者:auxten 链接:https://zhuanlan.zhihu.com/p/20054757 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. CGI(Comm ...
- CGI,FastCGI,spawn-fcgi,nginx组合使用
目录 fastCGI 1. CGI 1.1 简介 1.2 CGI处理流程 1.3 环境变量 1.4 标准输入 1.5 CGI程序结构 1.6 测试 2. FastCGI 2.1 什么是FastCGI ...
- cgi,fastcgi,php-cgi,php-fpm之间的关系
参考文章: https://segmentfault.com/q/1010000000256516 http://www.thinkphp.cn/topic/42338.html 这篇文章写的挺好:h ...
- php cgi fastcgi php-fpm区别
CGI 的作用 CGI 是为了保证 web server 传递过来的数据是标准格式的,方便 CGI 程序的编写者. web server(比如说 nginx)只是内容的分发者. 如果请求 /index ...
- windos php7 fast cgi,FAST-CGI解析漏洞拿下网站并提权windows系统服务器
作为一个懒散的人,我比较喜欢关注网上发布的漏洞.利用最新的漏洞可以比较简单的得到webshell,然后利用webshell提权拿下服务器,这个是我最喜欢的.有一个很有意思的娱乐网站,我经常登陆浏览,以 ...
- 什么是CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI?
原文地址:http://www.mike.org.cn/articles/what-is-cgi-fastcgi-php-fpm-spawn-fcgi/ 什么是CGI CGI全称是"公共网关 ...
- 什么是CGI、FastCGI、PHP-CGI、PHP-FPM
什么是CGI CGI全称是"公共网关接口"(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行"交谈"的一种工具,其 ...
- PHP的SAPI【web server与应用程序沟通的标准泛称】:CGI、FastCGI 【web server与应用程序的具体标准】及其对应程序PHP-CGI PHP-FPM【具体的程序应用】
1 Web Server与app传递数据的方法:Apache采用加载模块的方式 apache-> httpd[apache的进程]-> LoadModule->php5_module ...
最新文章
- dp,px,pt,sp 的区别 以及dp 和 px 互转
- 用反射去构建一个对象吧!
- glob及IO重定向
- 反思代码能力提升方法:重构 多写 知识面
- Requests库实战(二)---破解百度翻译
- linux任务处理函数,Linux信号掩码和信号处理函数
- pythontk界面显示函数中的变量值_简单易学,西门子触摸屏3种修改变量值的方法!博图Wincc V14组态...
- Selenium自动化测试-JavaScript定位
- [算法] 十个经典排序算法
- 计算机存储单位字的英语,计算机存储基本单位,位、字节、字以及KB、MB和GB怎么换算?...
- 句句真研—每日长难句打卡Day16
- HTML头标签使用-又一次定向,refresh
- php 学习编译扩展
- java设计模式 观察者模式_JAVA设计模式之观察者模式
- 如何有效预防宕机?你需要掌握这4个方法
- Microsoft Edge浏览器或者电脑上其他浏览器的主页被篡改后的解决办法。(适用于联想电脑)
- java ee7教程_JavaEE 7.0 Web技术教程 -解道Jdon
- plsql developer 怎么卸掉中文语言包
- [OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js提供了一个完整的基于Web的医学成像平台。...
- android 录屏方案 VFR和CFR
热门文章
- Android Fragment 嵌套使用报错
- [转]ghost手动备份及遇见的问题
- 我的IT历程,希望给大家点经验。
- California Dreaming
- Visual Studio 20年
- (总结)CentOS 6.x使用yum快速安装Apache+PHP+Tomcat(JSP)+MySQL
- 01:谁考了第k名 个人博客:doubleq.win
- JavaScript中使用console调试程序的坑
- C++ : 编译单元、声明和定义、头文件作用、防止头文件在同一个编译单元重复引用、static和不具名空间...
- MongoDB修改删除数据