当前位置: 首页 > 后端技术 > PHP

CGI、FastCGI和PHP

时间:2023-03-30 00:58:47 PHP

CGI什么是CGICGI(CommonGatewayInterface)是一个标准协议,它为web服务器提供了一个标准协议,使得服务器可以像运行命令行界面程序一样运行第三方程序,这些第三方-派对程序可以动态生成网页。这些第三方程序称为CGI脚本(符合CGI定义的程序),简称CGI。这些CGI程序如何执行是由服务器决定的。通常,CGI脚本可以在收到Web请求时动态生成HTML。为什么会有CGI就像浏览器会向web服务器发送请求信息一样,web服务器在需要一个CGI程序时,也会将一些必要的信息传递给CGI程序。相应的,当CGI程序运行结束后,还需要向web服务器返回一些信息,其中包括http响应中的一些内容,如:当前请求的响应状态、返回的内容类型(如HTML、PDF等),或纯文本)等等。很久以前,不同的Web服务器会使用不同的方式与CGI程序交换信息,这使得CGI程序的通用性较差(CGI程序需要根据不同的Web服务器做相应的修改)。于是CGI诞生了,它定义了一些通用的方法来规范web服务器和CGI程序之间的信息交换。早期的CGI程序主要用于处理HTML表单。webserver与CGI程序的连接往往可以配置哪些url需要web服务器中的CGI程序处理。这通常是通过指定服务器上的某些目录属于CGI程序来完成的(这个目录对应某种形式的url,比如“http://example.com/cgi-bin/pr...”这个url对应cgi-bin目录,所以服务器知道这个请求需要CGI程序来处理)Web服务器把必要的信息保存在环境变量中,CGI程序从环境变量中获取必要的信息,所以两者之间的通信两者可以实现信息交换。CGI程序处理完成后,将原来发送到“标准输出”的信息传送到Web服务器,服务器再将结果返回给客户端。以下大部分参数由CGI标准规定,需要由Web服务器传递给CGI程序(通过前面提到的“环境变量”方法):服务器特定变量:SERVER_SOFTWARE:HTTP服务器的名称/版本SERVER_NAME:服务器的主机名(也可以是IP地址)GATEWAY_INTERFACE:CGI/version.Request具体变量: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:“?”之后的部分在网址中。这些请求字符串(querystring)通常以“name=value”的形式出现(例如var1=val1&var2=val2...)REMOTE_HOST:客户端的主机名REMOTE_ADDR:客户端的ip地址。AUTH_TYPE:身份验证类型(如果可用)REMOTE_USER:与AUTH_TYPE相关REMOTE_IDENT:查看身份,仅当服务器执行此类查找时。CONTENT_TYPE:如果使用PUT或POST方法,输入数据的Internet媒体类型,通过HTTP标头提供。:CONTENT_LENGTH同样,输入数据的大小(十进制,以八位字节为单位)如果通过HTTP标头提供。其他与useragent(一般是浏览器)相关的参数:HTTP_ACCEPT,HTTP_ACCEPT_LANGUAGE,HTTP_USER_AGENT,HTTP_COOKIECGI缺点每次请求都需要启动一个CGI程序,相对于一次请求处理,启动过程的性能消耗占了很大比例整个过程,所以如果每个请求都需要启动一个新的CGI程序来处理,显然在性能上是低效的。CGI的替代方案由于上述CGI的缺点,出现了以下替代方案:fastCGI(预生成的“prefork”);模块化,直接在web服务器中运行相应的程序,实现HTML的动态生成(如Apachemod_php);使用预编译的CGI程序(即编译语言);Java的servletFastCGI&php-fpm什么是FastCGIFastCGI是在CGI标准协议上发展起来的一种变体协议,它的主要目标是降低web服务器和CGI程序交互时的负载,让一个服务器可以同时处理更多的web请求同时。FastCGI的实现细节不同于CGI每处理一个请求就启动一个新的CGI程序。FastCGI使用一些内存驻留的CGI进程来处理源源不断的请求。这些CGI进程由FastCGI管理进程(FastCGI服务器)管理,而不是Web服务器。当Web服务器接收到一个Web请求时,Web服务器通过Unix域套接字、命名管道或TCP连接发送一些必要的信息和页面请求本身给FastCGI进程(至于发送给哪个CGI进程,由FastCGI分配)管理流程)。通过相同的连接,网络响应返回到网络服务器。响应返回后,连接可能会关闭,但是Web服务器和处理请求的CGI进程会继续驻留在内存中,等待处理下一个请求。因此,每个CGI进程在其生命周期内可以处理许多Web请求,而不是像CGI那样只能处理一个Web请求。什么是php-fpmPHP-FPM(FastCGIProcessManager)是FastCGI在PHP中的具体实现。从PHP5.3.3开始,已经集成到PHP安装包中。Apache与phpCGI的连接(基本不再使用)模块化(mod_php)FastCGI具体配置可以参考:https://segmentfault.com/q/10...http://php.net/manual/en/实例..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/安装...