我目前正在开发一个涉及FastCGI和C ++的项目。现在我找到了official FCGI Library。我尝试了echo示例。
/*
* echo.c --
*
* Produce a page containing all FastCGI inputs
*
*
* Copyright (c) 1996 Open Market, Inc.
*
* See the file "LICENSE.TERMS" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
*/
#ifndef lint
static const char rcsid[] = "$Id: echo.c,v 1.1.1.1 2001/04/25 00:43:49 robs Exp $";
#endif /* not lint */
#include "fcgi_stdio.h"
#include <stdlib.h>
extern char **environ;
void PrintEnv(char *label, char **envp)
{
printf("%s:<br>\n<pre>\n", label);
for(; *envp != NULL; envp++) {
printf("%s\n", *envp);
}
printf("</pre><p>\n");
}
void main ()
{
char **initialEnv = environ;
int count = 0;
while(FCGI_Accept() >= 0) {
char *contentLength = getenv("CONTENT_LENGTH");
int len;
printf("Content-type: text/html\r\n"
"\r\n"
"<title>FastCGI echo</title>"
"<h1>FastCGI echo</h1>\n"
"Request number %d <p>\n", ++count);
if(contentLength != NULL) {
len = strtod(contentLength, NULL);
} else {
len = 0;
}
if(len <= 0) {
printf("No data from standard input.<p>\n");
} else {
int i, ch;
printf("Standard input:<br>\n<pre>\n");
for(i = 0; i < len; i++) {
if((ch = getchar()) < 0) {
printf("Error: Not enough bytes received "
"on standard input<p>\n");
break;
}
putchar(ch);
}
printf("\n</pre><p>\n");
}
PrintEnv("Request environment", environ);
PrintEnv("Initial environment", initialEnv);
} /* while */
}
我使用命令spawn-fcgi -p 8000 -n hello。
启动此脚本但是也可以在没有spawn-fcgi的情况下启动程序xy。你知道一个很好的例子还是文档?
感谢您的回答
答案 0 :(得分:4)
spawn-fcgi命令为您打开TCP连接并开始侦听指定的端口(在您的情况下为8000)。它将TCP连接上的请求转发到应用程序的stdin。它还将您对stdout的写入转发回TCP连接。
您可以使用FCGX_OpenSocket()调用自己创建连接,然后将返回的套接字传递给FCGX_InitRequest()。之后你可以使用FCGX_Accept_r()而不是FCGI_Accept()来进行循环!
BTW:还有很多人使用的工具而不是spawn-fcgi - supervisor。除了为您管理连接外,它还可以监控您的流程。因此,如果您的进程因某些奇怪的请求而崩溃,它会重新启动您的应用程序!