我希望编写一个FastCGI应用程序,它应该使用线程处理多个同时请求。我查看了SDK附带的threaded.c示例:
#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规范中有解释,Web服务器将确定FastCGI应用程序支持的连接数的方法:
引用: 应用程序内部可以查询特定变量。服务器通常会在应用程序启动时执行查询以自动化某些系统配置方面的操作。
• FCGI_MAX_CONNS:此应用程序将接受的最大并发传输连接数,例如“1”或“10”。
• FCGI_MAX_REQS:此应用程序将接受的最大并发请求数,例如“1”或“50”。
• FCGI_MPXS_CONNS:如果此应用程序不复用连接(即处理每个连接上的并发请求),则为“0”,否则为“1”。
但是这个查询的返回值被硬编码到FastCGI SDK中,FCGI_MAX_CONNS和FCGI_MAX_REQS返回1,FCGI_MPXS_CONNS返回0。因此,threaded.c示例永远不会接收多个连接。
我使用lighttpd和nginx测试了该示例,并且应用程序一次只处理一个请求。如何使我的应用程序处理多个请求?或者这种方法是错误的吗?