CGI、fastCGI、PHP-FPM三者间的关系
以前总是好奇于我们写的代码是如何被服务器所运行的,查阅了一番资料后我来总结下
webService
在远古时期,我们的网页只有静态的 html ,这时候我们的 服务器 的作用只是做内容分发。
例如我们访问www.baidu.com/demo.html
的时候,服务器就会给我们请求目录下的demo.html
的文件展示给我们。
但事物在发展,随着动态语言的出现(PHP、Python等等)。服务器就不能简单的把文件用浏览器展示给我们
例如我们访问 www.baidu.com/demo.php
时,服务器就应该把demo.php
的文件交给php的解析器来解析,这时候服务器要向解析器传输需要的数据了,因为语言不同所需要的数据格式就可能不同,这时候就需要制定一个统一的标准来传输数据。CGI(通用网关接口)标准就来了
CGI
作用: 用来规定传输哪些数据,以及用什么样的格式传递给后方处理这个请求的协议
在PHP中实现了这个协议的是PHP-CGI
程序,当我们的服务器收到demo.php
的请求时候,启动对应的CGI
程序,在这就是PHP-CGI
它接受浏览器传过来的 CGI格式的数据,幻化为php能看得懂的东,交给Php程序,再按照规定返回 CGI格式的处理结果给服务器。
执行流程如下:
但 CGI有一个很明显的一个问题:每次服务器发送请求都会重新执行一个进程,CGI进程处理请求结束后退出,当访问量增大,高并发情况下,就不适合了。于是诞生了 fastCGI
fastCGI
和 CGI
相比 它相当于一个常驻型的CGI,它分为master
进程和worker
,当 fastCGI过来时master进程
解析配置文件,初始化执行环境,启动多个worker
。
当请求过来时,master
会传递给一个worker
,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker
不够用时,master
可以根据配置预先启动几个worker
等着;当然空闲worker
太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是FastCGI
的对进程的管理。
作为CGI
的升级版,fastCGI
只是一种协议,用来沟通程序和Web服务器的桥梁,它在一个进程中一次完成多个请求。
PHP-FPM(FastCGI Process Manager)
总结
CGI和FastCGI都是一种通讯协议
fastCGI
是CGI
的改良版
PHP-CGI是CGI协议的实现
PHP-FPM是FastCGI协议的实现