FCGX_Accept_r在C上的简单FastCGI应用程序中运行两次

我正在尝试创build简单的用C语言编写的FastCGI应用程序:

#include <fcgiapp.h> #include <stdio.h> int main() { int sockfd = FCGX_OpenSocket("127.0.0.1:9000", 1024); FCGX_Request request; FCGX_Init(); FCGX_InitRequest(&request, sockfd, 0); while (FCGX_Accept_r(&request) == 0) { printf("Accepted\n"); FCGX_FPrintF(request.out, "Content-type: text/html\r\n\r\n<h1>Hello World!</h1>"); FCGX_Finish_r(&request); } } 

它工作正常 – 当我从浏览器调用它时,它显示“Hello World!”的页面。 信息。

问题是“while”中的代码工作了两次 ,也就是我在terminal中看到以下输出:

 [root@localhost example]$ ./hello Accepted Accepted 

为什么每个请求打印“接受”两次? 如果我把实际代码放在这里,比如查询一个数据库,它也会被执行两次。

你用什么程序来提出网络请求? 某些网络客户端也可能会请求一个例如favicon.ico文件,这可能会导致对fcgi进程的第二个请求:

 127.0.0.1 - - [29/Aug/2015:16:02:11 +0000] "GET / HTTP/1.1" 200 32 "-" "..." 127.0.0.1 - - [29/Aug/2015:16:02:11 +0000] "GET /favicon.ico HTTP/1.1" 200 32 "http://127.0.0.1/" "..." 

这可以通过检查Web服务器日志或添加调试到C程序来显示请求参数来确定。 使用telnet来请求GET / HTTP/1.0 ,我没有看到使用nginx webserver的forward-everything-to-fcgi webserver配置的双重打击。