cgi 从一个初学者的眼观看
cgi 和fastcgi 的详细文档可以参考 http://www.fastcgi.com/drupal/node/6 ,这里我就用自己的话说说。
cgi 和fastcgi 的作用是一样的,就是把web端的运行程序从web服务器分离出来,这样的好处就是web服务器可以专心做并发模型和i/o复用这块。fastcgi 是cgi的改进型,cgi最大的缺点是:重复地fork一个新子进程,做完作业后,就退出。当很多并发时,性能会很低。其实内存使用也类似,说到内存我插一小段(内存使用原则:1:不要频繁的申请或释放内存、2:尽可能申请大内存);除之外,cgi要求cgi程序和web服务器在同一台机器上(这是由于它们通信方式决定的)。fastcgi就克服了这个问题。从某个角度来说:fastcgi有点像连接池或进程池,研究它对多进程编程很有好处(多进程最要看他们怎么通信)
fastcgi的原理:
需要注意的是:fastcgi是一种规范,一种接口,而不是一个具体的软件。fastcgi的实现可以有多种,如:spawn-fcgi+libfcgi,spawn-fcgi用于进程管理(相对php-fpm很简单),libfcgi是写cgi程序的接口。下面是它们组合的一张时序图(来自http://blog.csdn.net/cleanfield/article/details/6412723):
从这张时序图可以看出:spawn-fcgi的进程管理是很简单了,它fork出指定个数子进程就退出了,子进程通过同一个socket 监听,当然至于哪个子进程accept,还需要进程同步。spawn-fcgi这种进程管理(感觉都称不上进程管理)的弊端是显而易见的。
fastcgi的另一种选择是:php-fpm(只用于php语言)
php-fpm的进程管理就复杂多了,一共有三种模式:
1、static 也就是子进程数指定,以后不变
2、dynamic 子进程的数目可以动态变化,但有个最大进程数和最小进程数,
3、ondemand
php-fpm的子进程同步是对监听socket加阻塞的记录锁,获得锁的子进程accept。