Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中使用FastCGI?_C_Apache_Cgi_Fastcgi - Fatal编程技术网

如何在C中使用FastCGI?

如何在C中使用FastCGI?,c,apache,cgi,fastcgi,C,Apache,Cgi,Fastcgi,我有一个网站,每个网页都被编译成二进制文件(我有100个网页,因此我有100个二进制文件)。Apache的.htaccess包含一行“SetHandler cgi脚本”,它指示Apache在请求二进制文件(网页)时使用cgi 如何修改此网站以使用FastCGI而不是CGI 我是否只需要在100个二进制文件中的每一个文件中包含这个头并使用while循环(),然后修改.htaccess到“SetHandler fastcgi脚本” 那么FastCGI到底是如何工作的呢?Apache将为整个网站使用1

我有一个网站,每个网页都被编译成二进制文件(我有100个网页,因此我有100个二进制文件)。Apache的.htaccess包含一行“SetHandler cgi脚本”,它指示Apache在请求二进制文件(网页)时使用cgi

如何修改此网站以使用FastCGI而不是CGI

我是否只需要在100个二进制文件中的每一个文件中包含这个头并使用while循环(),然后修改.htaccess到“SetHandler fastcgi脚本”


那么FastCGI到底是如何工作的呢?Apache将为整个网站使用1个持久化进程发送网页,或者100个二进制文件中的每一个都有1个持久化进程?

FastCGI脚本是一个网络服务器,用于侦听循环中的连接。web服务器将请求转发给FCGI服务器,FCGI服务器通过套接字连接发回一些动态生成的内容。因此,FCGI脚本比CGI更快,因为它不会为每个请求重新生成

我不明白为什么100页需要100个二进制文件。基于某些请求参数,单个脚本足以生成100页的内容。FCGI服务器还应该能够很好地扩展多个连接,因为它通常需要在套接字文件描述符上轮询。(查看实现代码以确保这一点)

要生成100页,您不一定需要100条if语句。考虑这个伪代码:

hash_table page_generators; // map page types to function objects (or function pointers)
page_generators["login_page"] = handle_login_page_fn; 
page_generators["contact_page"] = handle_contact_page_fn; 
// ... and so on

// request handler
page_type = request.get("page_type");
fn = page_generators[page_type];
if (fn == NULL)
    return "<html><body>Invalid request</body></html>";
else
    return fn(request);
哈希表页\u生成器;//将页面类型映射到函数对象(或函数指针)
页面生成器[“登录页面”]=处理登录页面;
第页发电机[“联系人第页”]=手柄第页联系人第页fn;
// ... 等等
//请求处理程序
page_type=request.get(“page_type”);
fn=页面生成器[页面类型];
如果(fn==NULL)
返回“无效请求”;
其他的
返回fn(请求);

不需要100个二进制文件?那你怎么做呢?一个有100个if条件的二进制文件?如果(strstr(getenv(“请求URI”),“页面名称”){…}elseif。。。而且,一个二进制文件会非常大。@bobby:没有100个二进制文件那么大。所有这些二进制文件中的启动成本和样板文件都比几个if语句要昂贵得多。如果你想知道为什么不把可用的请求放进C等价的映射结构中,我敢肯定,单独在其中查找当前请求比点击磁盘查找正确的二进制文件要便宜。@bobby关于如何避免100
If
语句,请参阅更新的答案。我犯了+1,我一直想听到C.Gy同情怜悯(而不是100个二进制文件,考虑一个可用的Web框架:
hash_table page_generators; // map page types to function objects (or function pointers)
page_generators["login_page"] = handle_login_page_fn; 
page_generators["contact_page"] = handle_contact_page_fn; 
// ... and so on

// request handler
page_type = request.get("page_type");
fn = page_generators[page_type];
if (fn == NULL)
    return "<html><body>Invalid request</body></html>";
else
    return fn(request);