我想写一个FastCGI应用程序,它应该使用线程处理多个同时发生的请求。我有一个看看threaded.c样品附带的SDK:多线程FastCGI应用程序
#define THREAD_COUNT 20
static int counts[THREAD_COUNT];
static void *doit(void *a)
{
int rc, i, thread_id = (int)a;
pid_t pid = getpid();
FCGX_Request request;
char *server_name;
FCGX_InitRequest(&request, 0, 0);
for (;;)
{
static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER;
/* Some platforms require accept() serialization, some don't.. */
pthread_mutex_lock(&accept_mutex);
rc = FCGX_Accept_r(&request);
pthread_mutex_unlock(&accept_mutex);
if (rc < 0)
break;
server_name = FCGX_GetParam("SERVER_NAME", request.envp);
FCGX_FPrintF(request.out,…
…
FCGX_Finish_r(&request);
}
return NULL;
}
int main(void)
{
int i;
pthread_t id[THREAD_COUNT];
FCGX_Init();
for (i = 1; i < THREAD_COUNT; i++)
pthread_create(&id[i], NULL, doit, (void*)i);
doit(0);
return 0;
}
在FastCGI specification有一个交代,Web服务器将如何确定有多少连接通过FastCGI的应用程序的支持:
Web服务器可以查询应用程序中特定的 变量。服务器通常会在应用程序启动时执行查询 ,以使 配置的某些方面自动化。
...
•FCGI_MAX_CONNS:并发传输线路 的最大数量 该应用将接受,例如“1” 或“10”。
•FCGI_MAX_REQS:这个 应用程序将接受的并发请求的最大数量 ,例如, “1”或 “50”。
•FCGI_MPXS_CONNS: “0” 如果这个 应用程序不复 连接(即通过每个线路处理并发 请求), “1”,否则 。
但该查询返回的值是硬编码到FastCGI的SDK和FCGI_MPXS_CONNS返回1 FCGI_MAX_CONNS和FCGI_MAX_REQS和0。因此threaded.c示例永远不会收到多个连接。
我使用lighttpd和nginx测试了示例,该应用程序一次只处理一个请求。我如何让我的应用程序处理多个请求?或者这是错误的方法?
您是如何测试并发性的?关于FCGI支持并发的程度有很多不同的信息可用。虽然我没有声称已经找出所有答案,但我尝试了多线程测试来验证并发性:两个线程被配置为接受连接。第一个人在接受连接后会睡10秒,阻止该线程。第二个连接被接受并作出响应。最后,第一个线程完成并作出响应。你的问题差不多一岁了,但我在寻找关于FCGI的答案时遇到了麻烦,所以希望这会有所帮助。 – HikeOnPast 2012-04-06 21:19:25