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的原理:

image

      需要注意的是: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

image

php-fpm的子进程同步是对监听socket加阻塞的记录锁,获得锁的子进程accept。

posted @ 2012-09-07 10:54  jiejnan  阅读(334)  评论(0编辑  收藏  举报