2

我目前正在从事一个涉及 FastCGI 和 C++ 的项目。现在我找到了官方的 FCGI 库。我尝试了回声示例。

/* 
 * 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。你知道一个很好的例子或文档吗?

感谢您的回答

4

1 回答 1

4

spawn-fcgi 命令为您打开一个 TCP 连接并开始侦听指定端口(在您的情况下为 8000)。它将通过 TCP 连接传入的请求转发到应用程序的标准输入。它还将您对标准输出的写入转发回 TCP 连接。

您可以使用 FCGX_OpenSocket() 调用自己创建连接,然后将返回的套接字传递给 FCGX_InitRequest()。之后,您可以使用 FCGX_Accept_r() 而不是 FCGI_Accept() 进行循环!

顺便说一句:许多人使用另一种工具代替 spawn-fcgi - 主管。除了为您管理连接外,它还监控您的流程。因此,如果您的进程由于某些奇怪的请求而崩溃,它会重新启动您的应用程序!

于 2013-11-11T18:19:41.647 回答