Linux做为自由软件的表明,给IT行业带来了无限的发展空间。 Linux的透明性,不管给开发人员仍是应用人员都有一个充分发挥的余地,在以 Linux系统为做业和平台上,更多的功能正在被不断地开发出来。像Server Push、FastCGI、EPERL、PHP3等许多的新功能,正是在Linux这样自由的土壤中才得以充分的发展。 一个网站的性能,主要表如今如下几个方面:系统响应时间、处理时间、用户等待时间和系统的输出负载,若是考虑经济因素还要加上技术成本。要提升网站的性能,在不改变硬件和网络结构的基础上,那么技术内涵就集中在优秀的程序上。目前来讲,Server Push(推技术)和FastCGI两项新技术在彻底不增长成本的基础上可使你的网站达到最佳的性能。本文将详细介绍FastCGI技术。 什么是FastCGI 要说明一点,若是要使用FastCGI,你应该在以Linux为做业系统的Apache服务上编译FastCGI模块,你们能够到www.fastcgi.com去下载最新的模块,下载的这个模块中会有详细的编译说明。 多年以来,CGI已经成了服务器端应用程序开发的事实标准,虽然ASP技术的出现使服务器端应用程序开发更方便,可是ASP的局限性使目前仍以Unix/Linux为做业系统并使用Apache为服务程序的绝大多数的服务器拒其于门外,CGI仍然唱着服务器端应用程序开发的重头戏。随着时间的推移,不少服务器在沉重的CGI负担下已经力不从心了。 仍是让咱们来看看CGI是如何工做的吧:当客户机对服务器请求CGI应用程序时,服务器创建一个进程来处理用户请求,完成后结束进程。当负载很低时,CGI能很好地工做,可是一个大型的站点上的各类不一样类型的请求随时发生,在客户请求的负载很高时,服务器进程的设置和初始化所用的时间就成为网站性能的瓶颈。特别是像和数据库这样的应用程序链接时,初始化所用的时间较长。 当 FastCGI技术脱颖而出的时候,这个问题就获得了很好的解决。 FastCGI始终处于活动状态为来自服务器的请求提供服务。FastCGI是在服务器上运行一个“活动的程序"来处理服务器对应用程序的请求。FastCGI始终处于活动状态,这正是它的优势,它在处理请求时没有启动新进程和对应用程序初始化的开销。服务器端能够用PERL、C、C++或JAVA等语言来编写一个基于 FastCGI的应用程序,来不断地处理服务器对应用程序的请求。特别是对于Server Push这样的链接方式,服务器要不间断地响应用户请求,就要不断地让应用程序运行来支持服务器对应用程序的请求。
FastCGI的优势 咱们知道,CGI是不能利用内存来做为缓存的,由于它为每个请求运行一次应用程序,并在完成任务后退出。而 FastCGI能够颇有效地利用内存来做缓存,大大地提升了它处理请求的性能。单独的FastCGI应用程序和 CGI相比,也许并无很好地利用缓存,而一旦FastCGI被设计成多线程,就能够运行并发处理多请求的应用程序进程,这样多线程就能够共享进程内存而访问同一缓存。 FastCGI的另外一大优势是它能够利用分布式网络系统来完成大规模的系统集成。一个网站,要完成用户的交互性要求,至少要具有电子邮件、BBS和聊天室这三大功能,考虑到数据安全性和数据库容量等因素,不多有网站把全部的数据都放在同一主机上。你们知道,因为进程环境缘由,服务器只能调用本机的CGI应用程序,这就给多主机的分布式系统带来局限性。而FastCGI应用程序不从进程环境中获取CGI变量,而是在FastCGI 应用程序和服务器之间创建一个“全双工”的链接,传递环境信息、STDIN、STDOUT和STDERR。这样咱们就能够把FastCGI应用程序放置在另外的主机上,利用TCP/IP协议与主服务器远程链接。在主服务器对FastCGI应用程序发出请求时能够像本地机同样做出响应。这样作的好处是: 1.能够扩大网路系统的规模 2.能够减轻同一服务器的负载 3.多服务器可共享同一FastCGI应用程序。
如何编写FastCGI应用程序 让咱们先来看看FastCGI是如何运行的: 正如你看到的同样, FastCGI在处理一个请求后继续保持运行,以便在新的请求到来时能当即处理请求。因此 FastCGI程序一般包括初始化代码段和封装程序主体的响应循环段,固然初始化完成后,主体程序不断循环运行等待请求的到来。只有在这个 FastCGI应用程序被系统撤销时循环才结束。 FastCGI的另外一个优势就是从CGI转向 FastCGI很是简单,咱们先来看一个传统的CGI: 示例一:NUMBER.CGI #!/usr/bin/perl # Variables my $End = 10; my $i; # Content Header print ″Content-type: text/html;CHARSET=gb2312\n″; # Main loop for ($i=0;$i〈$End;$i++) { print ″$i〈br〉;} exit 0; 这个CGI在浏览器页面上从1到10按每行一个数字显示。