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 接続で着信するリクエストをアプリケーションの stdin に転送します。また、標準出力への書き込みを TCP 接続に転送します。

FCGX_OpenSocket() 呼び出しを使用して自分で接続を作成し、返されたソケットを FCGX_InitRequest() に渡すことができます。その後、FCGI_Accept() の代わりに FCGX_Accept_r() を使用してループに進むことができます!

ところで: 多くの人が spawn-fcgi の代わりに使用する別のツールがあります - スーパーバイザーです。接続を管理するだけでなく、プロセスも監視します。そのため、奇妙なリクエストが原因でプロセスがクラッシュした場合、アプリケーションが再起動されます!

于 2013-11-11T18:19:41.647 に答える