他们之间的不一样在于
FastCgi的进程是常驻的,监听一个socket, 无线循环等待。当有请求的时候,web服务器会将请求经过socket发送给fastcgi进程管理程序(例如php-fpm),fastcgi管理程序会将请求经过sockert转发给fastcgi程序, 收到请求就会进行处理, 处理完就会继续等待。 fastcgi进程管理程序启动的时候是经过exec()函数启动多个fastcgi子进程,也就是worker进程,高并发状况下,会将请求分散到不一样的子进程上。 既然基于socket的,那么应该是能够将fastcgi部署在其余主机上。
cgi程序, web服务器每获得一个请求,就会调用popen的方式启动一个cgi进程, 该cgi进程会读取环境变量和标准输入, 而后进行处理,输出到标准输出哪里。 popen会返还一个管道的文件描述符,以此能够进行输入输出。
下面是一个cgi程序例子
#include "stdio.h"
#include "stdlib.h"
#include <string.h>
int mian()
{
char *data;
data = getenv("QUERY_STRING");
puts(data);
printf("Hello cgi!");
return 0;
}
老生常谈: cgi对每一个请求都会新建一个进程处理,处理完就关闭。 fastcgi进程是常驻的,初始化的时候不处理请求, 在主循环中接受请求处理。 fastcgi进程管理程序则是统一管理fastcgi进程的,负责预先启动fastcgi、创建fastcgi进程池、转发请求给fastcgi进程、转发返还给web服务程序、监听socket接收web服务程序的请求。