FastCgi與Cgi

 
他們之間的不一樣在於
 
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服務程序的請求。
相關文章
相關標籤/搜索