Skip to the content.

CGI

Web Server 与 Web Application 之间数据交换的一种协议就是CGI。

Web Server 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等服务器,

Web Application 一般指PHP、Java、Asp.net等应用程序。

CGI程序运行在独立的进程中,并对每个Web请求创建一个进程,这种方法非常容易实现,但效率很差,难以扩展。面对大量请求,进程的大量创建和消亡使操作系统性能大大下降。

** 为了解决CGI这种低效的方式,因此就出现了FASTCGI。 **

FASTCGI

FASTCGI生成一些解释器进程,这些解释器进程只是在创建时初始化环境,读取配置文件等等。如果再来CGI请求的,直接交给解释器进程执行即可。FASTCGI只是一个协议。

那么PHP-FPM又是什么呢? PHP-FPM是实现了FASTCGI协议。

PHP-FPM

PHP-FPM的管理对象是php-cgi(PHP解释器)

因为PHP-CGI只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理。所以就出现了一些能够调度 php-cgi 进程的程序,比如说由lighthttpd分离出来的spawn-fcgi。同样,PHP-FPM也是用于调度管理PHP解析器php-cgi的管理程序。

Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。PHP-FPM实现了FASTCGI协议。

参考资料

https://segmentfault.com/q/1010000000256516

https://www.awaimai.com/371.html

https://zh.wikipedia.org/wiki/FastCGI