乐趣区

fastcgi与cgi有什么不同

前言
现在的 CGI 基本没人使用,不安全以及性能极其低下,越来越多的使用 web 内置扩展、fastCGI。例如微软 iis 的 ISAPI,apache 的 php 模块,nginx 的 php-cgi。CGI、内置模块、fastcgi 这三种性能最好的要属于 fast_cgi 速度最快,但是需要额外的进程。解析来看看 CGI 和 FASTCGI 有什么不同.
CGI 方式介绍:
cgi 在 2000 年或更早的时候用得比较多,以前 web 服务器一般只处理静态的请求,如果碰到一个动态请求怎么办呢?web 服务器会根据这次请求的内容,然后会 fork 一个新进程来运行外部 c 程序(或 perl 脚本 …),这个进程会把处理完的数据返回给 web 服务器,最后 web 服务器把内容发送给用户,刚才 fork 的进程也随之退出。如果下次用户还请求改动态脚本,那么 web 服务器又再次 fork 一个新进程,周而复始的进行。
web 内置模块介绍:
后来出现了一种更高级的方式是,web 服务器可以内置 perl 解释器或 php 解释器。也就是说这些解释器做成模块的方式,web 服务器会在启动的时候就启动这些解释器。当有新的动态请求进来时,web 服务器就是自己解析这些 perl 或 php 脚本,省得重新 fork 一个进程,效率提高了。
fastcgi 方式介绍:
fastcgi 的方式是,web 服务器收到一个请求时,他不会重新 fork 一个进程(因为这个进程在 web 服务器启动时就开启了,而且不会退出),web 服务器直接把内容传递给这个进程(进程间通信,但 fastcgi 使用了别的方式,tcp 方式通信),这个进程收到请求后进行处理,把结果返回给 web 服务器,最后自己接着等待下一个请求的到来,而不是退出.
fastcgi 跟 cgi 的区别表格:

举个例子: 服务端现在有个 10 万个字单词,客户每次会发来一个字符串,问以这个字符串为前缀的单词有多少个。那么可以写一个程序,这个程序会建一棵 trie 树,然后每次用户请求过来时可以直接到这个 trie 去查找。但是如果以 cgi 的方式的话,这次请求结束后这课 trie 也就没了,等下次再启动该进程时,又要新建一棵 trie 树,这样的效率就太低下了。而用 fastcgi 的方式的话,这课 trie 树在进程启动时建立,以后就可以直接在 trie 树上查询指定的前缀了。

退出移动版