2011-06-23 37 views
3

我目前正在开发高负载项目,我需要使用C/FastCGI/nginx组合。FastCGI fork in c

问题是,我需要我的FastCGI应用程序在线程/进程中运行。

我知道两种方法可以做到这一点:

1)编译程序,比使用产卵 - fcgi的到餐桌的过程。 (我不能用这个)

2)运行FCGX_Init(),比前叉10个processess前while (FCGX_Accept_r(&request) >= 0)

3)运行并行线程后while (FCGX_Accept_r(&request) >= 0)

所以,我的问题是:WHIS是运行fastcgi应用程序的最快方法。我可以在这之后的预叉FastCGI应用:

int sock = FCGX_OpenSocket(":9000", 10); 
FCGX_InitRequest(&request, sock, 0); 

10个进程能听单插座?我是否必须使用线程,如果我有N进程正在运行?这会足够吗?

+0

为什么你不能使用'spawn-fcgi'?这似乎是最好的选择,因为它会为你处理负载均衡叉。 – T0xicCode

回答

4

我不知道您正在使用的FastCGI API,但通常您不能将文件描述符(即套接字)交给另一个进程,除非它在分叉前打开。进程具有独立的文件描述符表。线程将全部共享相同的文件描述符表,因为它们处于相同的进程中。

就我所知,您一次只能在一个端口上监听一个进程。通常做的是让一个线程的唯一工作是监听连接。当它获得一个时,连接将被接受并交给池中的下一个工作线程,方法是让线程接管已接受的套接字(而不是侦听套接字),直到套接字关闭。监听线程立即返回监听连接。

这应该给你最小的开销。