搞懂CGI,FastCGI,PHP-CGI,PHP-FPM

注:本文大部分内容来源互联网,本人做了部分修改,并已经注明来源

CGI

CGI是Web Server 与 Web Application 之间数据交换的一种协议。
具体作用如下图所示

cgi.png

在上面的过程中,要注意的几点:

  • Http 协议只存在于Web Client和Web Server之间,与CGI程序之间没有任何关系,所以使用CGI技术无法对Http的传输产生任何影响;

  • Web Server与CGI程序之间的数据传输遵循的是CGI规范,此时Web Server作为CGI请求的客户端,CGI程序作为CGI请求的服务器;

  • Web Server和CGI程序运行在同一个主机上,针对每个CGI请求,Web Server都会fork一个新的CGI程序的进程,等到请求处理完毕则该进程结束,等待下一个请求再来的时候,则重新fork一个进程运行CGI程序;

  • Web Server接受了Web Client发送的Http请求,

  1. 如果请求的是静态页面则直接到Web Server自己的目录下查询并直接返回;
  2. 如果是动态页面(至于如何判断是静态页面还是动态页面则是在Web Server中通过正则表达式进行匹配),通过解析该请求携带的信息,并依据CGI规范将这些信息打包到CGI规定的变量中,然后在Web Server中调用OS中对应的CGI程序来解析该CGI请求,然后生成相应的页面返回给Web Server服务器,然后Web Server再将该内容返回给客户端;
  • CGI程序不对Web 客户端开放,它只对Web Server 服务器负责以供调用,CGI程序是与OS有关的,需要根据OS的环境使用适当的语言来开发,目前最流行的就是迎着全世界的嘲讽占领世界的PHP脚本语言解析器。

链接:https://blog.csdn.net/lmy86263/article/details/54178336

FastCGI

FastCGI和CG类似,是一种通信协议,但比CGI在效率上做了一些优化。

CGI相较于FastCGI而言其性能瓶颈在哪呢?CGI针对每个http请求都是fork一个新进程来进行处理,处理过程包括解析php.ini文件,初始化执行环境等,然后这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求动态资源,那么web服务器又再次fork一个新进程,周而复始的进行。

而FastCGI则会先fork一个master,解析配置文件,初始化执行环境,然后再fork多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是FastCGI的对进程的管理。大多数FastCGI实现都会维护一个进程池。注:swoole作为httpserver,实际上也是类似这样的工作方式。

链接:https://www.zhihu.com/question/30672017/answer/127048585

PHP-CGI

PHP-CGI是PHP的CGI协议进程解释器,每次启动时,需要经历加载php.ini文件->初始化执行环境->处理请求->返回内容给webserver->php-cgi进程退出的流程。如下图

php-cgi进程解释器.jpeg

(图片来源网络,侵删)

PHP-FPM

PHP-FPM是对FastCGI协议的实现,是进程管理器,启动时包括master和worker进程两部分,master进程监听端口,接收来自webserver请求,worker进程一般具有多个,每个worker进程都有一个cgi进程解释器,用来执行php代码。

fastcgi.jpeg

(图片来源网络,侵删)

你可能感兴趣的:(搞懂CGI,FastCGI,PHP-CGI,PHP-FPM)