用C语言开发FastCGI应用程序——fcgi_stdio包API

官方文档:http://www.fastcgi.com/devkit/doc/fcgi-devel-kit.htm

官网头文件:http://www.fastcgi.com/devkit/include/fcgi_stdio.h

简介

FastCGI软件开发套件用于简化把现有的CGI程序转成FastCGI程序或者编写FastCGI程序。

  I/O函数包

  在开发套件中有两个函数包:fcgi_stdio 和 fcgiapp,在你的程序中必须包含这些包中的一个:

  fcgi_stdio.h fcgiapp.h

        fcgi_stdio包,是fcgiapp包的顶层包,在转化CGI程序或者是写新的FastCGI程序是,我们强烈推荐你用它。用这个库,你的二进制程序既可以当作CGI也可以当作FASTCGI程序来运行(原文:Thefcgi_stdio library provides the easiest transition for C CGI programs and C CGI programmers to FastCGI. Using this library your application can run using either CGI or FastCGI, with the same binary for both situations.)。

        fcgiapp包是另一个fastcgi库。它没有像fcgi_stdio包一样提供那么多兼容性;所以,它也没有使用那么多宏。fcgi_stdio包是运行在fcgiapp上的一层。

                基于fcgiapp包运行的程序不能当作CGI程序来运行。这种特性只在fcgi_stdio层提供。

                fcgiapp包中的函数以 FCGX_ 开头,而不是以 FCGI_ 开头。比如:FCGX_Accept FCGI_Accept 的fcgiapp版本。

                fcgiapp包中的函数的描述文档以扩展的注释方式包括在头文件include/fcgiapp.h 中。范例程序examples/tiny-fcgi2.cexamples/echo2.c 说明如果使用fcgiapp包。

        (原文:

The fcgiapp library is a second C library for FastCGI. It does not provide the high degree of source code compatibility provided byfcgi_stdio; in return, it does not make such heavy use of#define.fcgi_stdio is implemented as a thin layer on top of fcgiapp.

Applications built using the fcgiapp library cannot run as CGI programs; that feature is provided at thefcgi_stdio level.

Functions defined in fcgiapp are named using the prefix FCGX_ rather thanFCGI_. For instance,FCGX_Accept is thefcgiapp version ofFCGI_Accept.

Documentation of the fcgiapp library takes the form of extensive comments in the header fileinclude/fcgiapp.h. The sample programsexamples/tiny-fcgi2.c andexamples/echo2.c illustrate how to usefcgiapp.)

        本文主要介绍fcgi_stdio包,它有以下几个优点:

  简单:只要有三个新的API需要学。

  易懂:如果你正把CGI程序转化为FastCGI程序,你会发现CGI程序与FastCGI程序之间只有很少的区别。在我们设计函数库的时候我们尽可能的 把FastCGI应用程序变得容易理解,以至于我们在建立新FastCGI程序的时候我们使用相同的环境变量,相同的解析查询字符串的技术,以及相同的 I/O程序等。

  方便:这个库函数提供了CGI和FastCGI二进制的文件的完美兼容。因此不管是CGI还是FastCGI,都同样运行。

  fcgi_stdio包开发的fastcgi代码结构

  FastCGI的代码构成,把你的代码分成两个独立部分:

  1.初始化部分:只执行一次

  2.应答循环部分:FastCGI脚本每被调用一次,这部分就被执行一次

  

  一个应答循环的典型格式如下:

  while (FCGI_Accept() >= 0) {//循环条件

  # 应答循环体

  }

  

  直到一个客户端请求来的时候FCGI_Accept块才执行,并返回0。如果有一个系统故障,或是系统管理员终止进程,Accept将返回-1。

  如果应用程序作为一个CGI程序被调用,那么第一次调用Accept时,返回0,第二次总是返回-1,产生CGI行为。(请详见20页的"FCGI_Accept (3)" )

  注意,在CGI中鼓励用小脚本,然而在FastCGI中则鼓励使用组合式的脚本。你可以在重新构想你的程序的全局结构,来获得FastCGI的高性能。

  例1: TinyFastCGI

  这是一个用C语言写的一个简单FastCGI应答程序例子:

#include "fcgi_stdio.h"
#include <stdlib.h>

int count;

void initialize(void)
{
    count=0;
}
void main(void)
{
    initialize();
    while (FCGI_Accept() >= 0)
    {
        printf( "Content-type: text/html\r\n"
            "\r\n"
            "<title>FastCGI Hello! (C, fcgi_stdio library)</title>"
            "<h1>FastCGI Hello! (C, fcgi_stdio library)</h1>"
            "Request number %d running on host <i>%s</i>\n",
            ++ count, getenv( "SERVER_HOSTNAME" ) );
  }
}

  例2:原始数据产生器

  思考一下,一个应答应用程序产生第N次原始数据。

  一个CGI应用程序将没有有效的方法来解决这个问题。例如,如果用户访问第50000次的原始数据,那么CGI应用程序就不许从第一条原始数据开始计算,直到第50000条的,要是应用程序终止,伴随着她辛苦积累的数据也会随之消失。

  如果一个客户端想访问第4900条原始数据,那么服务器必须重新开始积累。

  由于我们能维持这个状态,FastCGI应用程序对与这样的问题就更有效。一个FastCGI应用程序在初始化阶段能够计算一个扩展的源数据的表,并保持表的不同范围。当客户端请求一个特别原始数据的时候,循环应答需要从表里查询。

  这里有一个原始数据代码事例:

  

#include "fcgi_stdio.h"
#include <stdlib.h>
#include <string.h>

#define POTENTIALLY_PRIME 0
#define COMPOSITE 1
#define VALS_IN_SIEVE_TABLE 1000000
#define MAX_NUMBER_OF_PRIME_NUMBERS 78600

long int sieve_table[VALS_IN_SIEVE_TABLE];
long int prime_table[MAX_NUMBER_OF_PRIME_NUMBERS];

void initialize_prime_table(void)
{
    long int prime_counter = 1;
    long int current_prime = 2, c, d;
    
    prime_table[prime_counter] = current_prime;
    while ( current_prime < VALS_IN_SIEVE_TABLE )
    {
        for ( c = current_prime; c <= VALS_IN_SIEVE_TABLE; c += current_prime )
        {
            sieve_table[c] = COMPOSITE;
        }
        for ( d=current_prime+1; sieve_table[d] == COMPOSITE; d++ );
            prime_table[++prime_counter] = d;
        current_prime = d;
    }
}

void main(void)
{
    char *query_string;
    long int n;
    initialize_prime_table();
    
    while( FCGI_Accept() >= 0 )
    {
        printf( "Content-type: text/html\r\n\r\n" );
        printf( "<title>Prime FastCGI</title>\n"
            "<h1>Prime FastCGI</h1>\n" );
        query_string = getenv( "QUERY_STRING" );
        if( query_string == NULL )
        {
            printf("Usage: Specify a positive number in the query string.\n");
        }
        else
        {
            query_string = strchr(query_string, '=') + 1;
            n = strtol(query_string);
            if ( n < 1 )
            {
                printf( "The query string '%s' is not a positive number.\n", query_string );
            }
            else if ( n > MAX_NUMBER_OF_PRIME_NUMBERS )
            {
                printf( "The number %d is too large for this program.\n", n );
            }
            else
            {
                printf( "The %ldth prime number is %ld.\n", n, prime_table[n] );
            }
        }
    }
}

  这个应用程序在初始化时有一个显而意见的开销,但是后来的访问是快速的。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个 Nginx 配置文件中与 FastCGI 相关的指令。下面是每个指令的详细解释: 1. `fastcgi_pass 127.0.0.1:9000;` 这个指令指定了 FastCGI 应用程序的地址和端口号。它告诉 Nginx 将请求发送到这个地址和端口,以便 FastCGI 应用程序能够处理它们。 2. `fastcgi_index index.php;` 这个指令指定了 FastCGI 应用程序应该处理的默认文件名。如果请求的 URL 没有指定文件名,Nginx 将尝试使用这个指令指定的文件名。 3. `include fastcgi.conf;` 这个指令告诉 Nginx 含一个名为 fastcgi.conf 的文件。这个文件含一些常用的 FastCGI 配置指令和变量定义,这些指令和变量通常在 FastCGI 应用程序的配置中使用。 4. `fastcgi_cache ngx_fcgi_cache;` 这个指令启用了 FastCGI 缓存。它指定了缓存存储区域的名称,即 ngx_fcgi_cache。缓存存储区域可以是磁盘或内存。 5. `fastcgi_cache_valid 200 302 1h;` 这个指令指定了当 FastCGI 应用程序返回成功响应(HTTP 状态码 200 或 302)时,缓存的响应应该保留多长时间。在这个例子中,响应将被缓存 1 小时。 6. `fastcgi_cache_valid 301 1d;` 这个指令指定了当 FastCGI 应用程序返回永久重定向响应(HTTP 状态码 301)时,缓存的响应应该保留多长时间。在这个例子中,响应将被缓存 1 天。 7. `fastcgi_cache_valid any 1m;` 这个指令指定了当 FastCGI 应用程序返回任何其他响应时,缓存的响应应该保留多长时间。在这个例子中,响应将被缓存 1 分钟。 8. `fastcgi_cache_min_uses 1;` 这个指令指定了每个缓存键应该至少被访问多少次才能被缓存。在这个例子中,每个缓存键至少被访问一次才能被缓存。 9. `fastcgi_cache_use_stale error timeout invalid_header http_500;` 这个指令指定了当 FastCGI 应用程序返回错误响应或超时时,是否应该使用旧的缓存响应。它还指定了一些可以被缓存的 HTTP 响应头(例如,HTTP 状态码 500)。 10. `fastcgi_cache_key http://$host$request_uri;` 这个指令指定了用于缓存键的变量。在这个例子中,缓存键将由主机名和请求 URI 组成。这意味着相同的 URI 在不同的主机上将产生不同的缓存键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值