我查看了 FastCGI (fcgi-2.4.0) 的来源,实际上没有分叉的迹象。如果我是正确的,Web 服务器会为 FastCGI 模块生成一个进程(在其中编译或作为 SO/DLL 加载)并处理对主套接字(通常是 TCP:80 端口)的控制。
在 *nix 上,FastCGI 模块在整个文件描述符(实际上是监听套接字)上使用文件写锁(libfcgi/os_unix.c:989)“锁定”该套接字;这样,当新连接获得时,只有 FastCGI 模块能够处理这些。传入的套接字锁定在移交给 HTTP 请求处理之前被释放。
正如所见,FastCGI 模块不是多进程/线程(没有内部使用 fork/pthread_create)我假设多个同时连接的并发处理是通过从 n 个 FastCGI 模块进程的 Web 服务器(通过 OS_SpawnChild)生成的。例如,如果我们生成 3 个 FastCGI 进程(Apache 调用 3 x OS_SpawnChild),这是否意味着我们最多只能同时处理 3 个请求?
A) 我对 FastCGI 工作方式的看法是否正确?
B) 如果操作系统产生新进程/创建与本地数据库的连接的成本可以忽略不计,那么 FastCGI 与老式可执行方法相比有什么优势?
谢谢,艾玛!:-)