CGI,FASTCGI和PHPFPM

CGI(Common Gateway Interface) 公共网关接口

没有CGI之前,web服务器只用来简单的存储静态页面,浏览器向服务器请求相关页面,web服务器收到请求后返回相应的页面文件给浏览器,浏览器在进行渲染展示。随着时间发展和需求的递增,静态网站不在满足需求,越来越多的网站需要动态展示数据以及对进行一些逻辑处理。存储数据我们可以用数据库,处理数据以及逻辑控制这些我们可以用服务器脚本语言(php,python,java等,但是web服务器和脚本语言是相互独立的,他们怎么才能进行协同工作呢?这时就有了CGI协议,它规定了web服务器以何种方式将数据传递给脚本语言,脚本语言进行处理后,又将数据以什么方式返回给web服务器,而且脚本语言还可以和数据库进行交互。所以网站就能呈现动态。
在这里插入图片描述
总结:CGI 就是web服务器和脚本语言之间的一种协议。

FAST-CGI

使用cgi之后,浏览器向web服务器请求资源,web服务器此时启动一个cgi解释器,并通过cgi协议转发要运行的文件和接收到的参数,脚本语言运行处理之后,返回处理后的结果,然后cgi解释器进行自我销毁,然后web服务器将处理后的结果返回给浏览器。这个有个问题是CGI明明是个协议为啥需要启动和销毁,我猜测应该是将这个协议封装在一个程序中的。

当有多个请求时,处理每个请求cgi进程都要启动和关闭一次,这样就效率就十分低下,而且浪费系统资源,这时fast-cgi孕育而生。

FastCGI的整个工作流程是这样的:
这里所说的FastCGI子进程指的是遵循cgi协议的脚本语言+CGI协议。

  1. web服务器启动时载入FastCGI进程管理器,FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自web服务器的连接。
  2. 当客户端请求到达web服务器时,FastCGI进程管理器选择并连接到一个CGI解释器。 web服务器将需要处理的内容发送到FastCGI子进程cgi。
  3. FastCGI 子进程完成处理后将内容从同一连接返回web服务器。当FastCGI子进程关闭连接时,请求便处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。

PHP-FPM即PHP-FastCGI Process Manager

PHP-FPM是FastCGI的实现,并提供了进程管理的功能。

进程包含 master 进程和 worker 进程两种进程。

master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。

其他相关知识

Apache把PHP作为一个模块集成到Apache进程(httpd)运行,这种mod_php的运行模式与PHP-CGI没有任何关系。

Nginx是通过FastCGI来实现与PHP的通信。

mod_php 通过嵌入 PHP 解释器到 Apache 进程中,mod_php 这种嵌入的方式最大的弊端就是内存占用大,不论是否用到 PHP 解释器都会将其加载到内存中,典型的就是处理CSS、JS之类的静态文件是完全没有必要加载解释器。

CGI是比较原始的方式,而配置FastCGI模式需要下载安装相关的包。性能上,CGI模式每一次接到请求会调用php.exe,解析php.ini,加载DLL等,速度自然慢。

其中FastCGI下,实现了类似连接池的技术特性,保持了对后台的连接,请求到来即可使用,结束即断开准备与下一个请求连接。

Nginx默认不支持CGI模式,它是以FastCGI方式运行的。所以使用Nginx+PHP就是直接配置为FastCGI模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值