C++ FastCGI是如何在web服务器(如Apache2.2+;)上工作的?

C++ FastCGI是如何在web服务器(如Apache2.2+;)上工作的?,c++,c,apache,fastcgi,C++,C,Apache,Fastcgi,我看了一下FastCGI(fcgi-2.4.0)的源代码,实际上没有fork的迹象。 如果我没有弄错,web服务器将为FastCGI模块(在其中编译或加载为SO/DLL)创建一个进程,并将主套接字(通常为TCP:80端口)的控制权交给它 在*nix上,FastCGI模块在整个文件描述符(侦听套接字)上使用文件写入锁(libfcgi/os_unix.c:989)来“锁定”该套接字;这样,当新连接出现时,只有FastCGI模块能够处理这些连接。 传入套接字锁在移交给HTTP req处理之前被释放 由

我看了一下FastCGI(fcgi-2.4.0)的源代码,实际上没有fork的迹象。 如果我没有弄错,web服务器将为FastCGI模块(在其中编译或加载为SO/DLL)创建一个进程,并将主套接字(通常为TCP:80端口)的控制权交给它

在*nix上,FastCGI模块在整个文件描述符(侦听套接字)上使用文件写入锁(libfcgi/os_unix.c:989)来“锁定”该套接字;这样,当新连接出现时,只有FastCGI模块能够处理这些连接。 传入套接字锁在移交给HTTP req处理之前被释放

由于FastCGI模块不是多进程/线程(没有fork/pthread_create的内部用法),我假设多个并发连接的并发处理是通过n个FastCGI模块进程的web服务器(通过OS_SpawnChild)的spwang来获得的。 例如,如果我们生成3个FastCGI进程(Apache调用3 x OS_SpankChild),这是否意味着我们最多只能同时处理3个请求

A) 我对FastCGI工作方式的看法是否正确

B) 如果操作系统生成新进程/创建到本地数据库的连接的成本可以忽略不计,那么FastCGI相对于老式的可执行方法有什么优势

谢谢,
Ema!:-)

FastCGI派生的进程是持久性的,它们不会在处理请求后被杀死,而是“池化”的。

FastCGI相对于普通CGI的速度增益是进程是持久性的。e、 g.如果要打开任何数据库句柄,可以只打开一次。对于任何缓存都一样

主要的好处是不必每次都创建一个新的php/perl/etc.解释器,这需要花费惊人的时间

如果希望处理多个并发连接,则必须运行多个进程FastCGI进程。FastCGI不是通过任何特殊并发处理更多连接的方法。这是一种加速单个请求的方法,从而允许处理更多请求。但是你是对的,更多的并发请求需要更多的进程运行。

的确

如图所示(A)是可以的,那么(B)呢? 如果我说的是可执行文件(正确编译C/C++程序,而不是像Perl/PHP/……这样的脚本),如果我们考虑SPWAN成本和DB新连接成本可以忽略不计,那么这种方法(FASCGI)只是普通CGI可执行文件的一种小增益? 我的意思是,考虑到Linux在生成(分叉)进程方面非常快,并且如果DB在本地运行(例如,同一主机MySQL),那么启动新的可执行文件并连接到DB所需的时间实际上是0。在这种情况下,如果没有任何解释,只有apachec/C++模块会比这更快

使用FastCGI方法,您甚至更容易受到mem泄漏的影响,因为进程不是每次都分叉/重新启动的……此时,如果您必须在C/C++中开发CGI,直接使用老式CGI和/或Apache C/C++模块不是更好吗

同样,我不是在谈论脚本(perl/php/…),我是在谈论编译的CGI

再次感谢,
干杯,艾玛!:-)

是的,如果产卵的成本为零,那么遗留CGI将非常好。所以如果你没有太多的点击率,那么使用老的CGI就可以了。fast cgi的重点是做一些受益于大量持久性存储的事情,或者在完成工作之前必须构建的结构,比如对大型数据库运行查询,您希望将数据库库留在内存中,而不是每次运行查询时都必须重新加载整个数据库


当你的点击率很高时,这很重要。

Arul,谢谢,但我现在已经知道了……我想知道更具体的答案(A,B)。干杯,分叉的成本只是通过CGI运行PHP的一部分。一旦进程被分叉,您仍然必须将PHP可执行文件加载到内存中,并在启动时执行任何需要初始化的操作。另外,打开与数据库的新连接比重用和现有连接要昂贵得多。伙计们,谢谢你们的回答,但我不是在谈论perl/php脚本,而是在谈论编译后的可执行文件(例如根据cgicc库编译的C++源代码)…我不知道如何更清楚地编写它…绝对不知道;FastCGI可以支持多路复用,这意味着它可以同时处理多个连接。如果正确编程,这意味着您可以形成一个管道,在这个管道中,新连接永远不会因数据库连接打开而耗尽,这永远不会延迟立即从数据库查询返回结果。FastCGI模块的平均延迟可以比CGI低几个数量级;FastCGI允许使用单个线程处理多个并发请求。这是不真实的;CGI不能缓存,这意味着任何存储都必须重新加载(对数据库的访问很容易比简单的C程序加载慢)。CGI也不能多路复用(这意味着要获得并发性,需要多个进程)。这两个好处远比产卵成本重要;此外,它是