他們之間的不一樣在於
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服務程序的請求。