0°

如何通俗地解释 CGI、FastCGI、php-fpm 之间的关系?

那PHP-FPM又是什么呢?它是一个实现了Fastcgi协议的程序,用来管理Fastcgi起的进程的,即能够调度php-cgi进程的程序。现已在PHP内核中就集成了PHP-FPM,使用--enalbe-fpm这个编译参数即可。另外,修改了php.ini配置文件后,没办法平滑重启,需要重启php-fpm才可。此时新fork的worker会用新的配置,已经存在的worker继续处理完手上的活。

讲 Fastcgi 之前需要先讲 CGI,CGI 是为了保证 web server 传递过来的数据是标准格式的,它是一个协议,方便 CGI 程序的编写者。Fastcgi 是 CGI 的更高级的一种方式,是用来提高 CGI 程序性能的。

web server(如 nginx)只是内容的分发者。比如,如果请求/index.html,那么 web server 会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态资源。

如果现在请求的是/index.php,根据配置文件,nginx 知道这个不是静态文件,需要去找 PHP 解析器来处理,那么他会把这个请求简单处理后交给 PHP 解析器。此时 CGI 便是规定了要传什么数据/以什么格式传输给 php 解析器的协议。

当 web server 收到/index.php 这个请求后,会启动对应的 CGI 程序,这里就是 PHP 的解析器。接下来 PHP 解析器会解析 php.ini 文件,初始化执行环境,然后处理请求,再以 CGI 规定的格式返回处理后的结果,退出进程。web server 再把结果返回给浏览器。

那么 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,实际上也是类似这样的工作方式。

那 PHP-FPM 又是什么呢?它是一个实现了 Fastcgi 协议的程序,用来管理 Fastcgi 起的进程的,即能够调度 php-cgi 进程的程序。现已在 PHP 内核中就集成了 PHP-FPM,使用--enalbe-fpm 这个编译参数即可。另外,修改了 php.ini 配置文件后,没办法平滑重启,需要重启 php-fpm 才可。此时新 fork 的 worker 会用新的配置,已经存在的 worker 继续处理完手上的活。

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论