FastCGI与C ++的其他启动方法比spawn-fcgi

时间:2012-12-18 08:38:25

标签: c++ fastcgi

我目前正在开发一个涉及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。你知道一个很好的例子还是文档?

感谢您的回答

1 个答案:

答案 0 :(得分:4)

spawn-fcgi命令为您打开TCP连接并开始侦听指定的端口(在您的情况下为8000)。它将TCP连接上的请求转发到应用程序的stdin。它还将您对stdout的写入转发回TCP连接。

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

BTW:还有很多人使用的工具而不是spawn-fcgi - supervisor。除了为您管理连接外,它还可以监控您的流程。因此,如果您的进程因某些奇怪的请求而崩溃,它会重新启动您的应用程序!