php cgi&fastcgi&php-fpm

CGI(Common Gateway Interface),通用网关接口。设置了web server的外部程序的规范。

简单理解,就类似于php的接口,定义了输入、环境变量、输出的规范。

interface Cgi
{
   function input();
   function env();
   function output();       
}
标准输入 STDIN (get方式的请求,不放在标准输入中。post可以。)
环境变量  系统环境变量+当有http请求时(http服务器+客户端+cgi传输过程的信息),如php的$_SERVER信息是从此处获取的
标准输出 STDOUT ((mime类型 / location / 状态码)作为第一行 + 空行 + 输出内容)

cgi是运行在服务器上的,用于服务器与程序间的交互。

任何遵守cgi规范的程序都可以称为cgi程序。

php经常使用的服务器是nginx或Apache。

不过cgi有个硬伤,每次一个请求过来,都需要重新fork一个新的cgi进程,请求结束再kill掉该进程。若是有大量的请求过来,将直接搞摊服务器。

fastcgi就是为了处理这种情况而诞生的 ,每次fork一个cgi进程,请求结束并不会kill掉该进程,而是放回cgi池子,等待下一个请求。

有这么多的cgi进程,为了进一步管理这些cgi进程,php-fpm诞生了。

php-fpm有一个master进程和N个worker进程,master进程是管理worker进程的,可以理解为管理者。worker进程就是干活的小弟,将请求转给php-cgi去处理。

每次有一个新的请求过来,master进程将其放在一个队列中,让worker进程去抢夺这些请求。

原文地址:https://www.cnblogs.com/huachengai/p/13299180.html