我想寫一個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