生根於自由的土壤——FastCGI

火星人 @ 2014-03-12 , reply:0


  inux作為自由軟體的代表,給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按每行一個數字顯示。


  我們再看看如何用FastCGI來寫這個程序:


  示例二:NUMBER.FCGI


  #!/usr/bin/perl


  #為了使用FastCGI軟體包,需要加入如下聲明:


  Use FCGI;


  #初始化段和CGI初始化段一樣。


  # Variables


  my $End = 10;


  my $i;


  while (FCGIaccpet() 〉= 0) {


  # Content Header


  print ″Content-Type: multipart/x-mixed-replace;boundary=BOUNDARY\n\n″;


  #因為每個請求都要有相應的Content-Type頭標來響應,所以我們把它也作為響應循環的主體代碼段。


  # Main loop


  for ($i=0;$i〈$End;$i++)


  { print "$i〈br〉;}


  }


  exit 0;


  因為FastCGI和伺服器應用程序一樣運行,所以只有當FastCGI接收到結束信號時才退出,否則它就一直運行。


  雖然,從CGI轉向FastCGI是非常容易的,但在具體的應用實例中我們還要注意,如果原來的CGI程序中存在可能使主體代碼不能正常循環運行的代碼時,必須對它進行修改,即對一些變數、數組重新初始化。FastCGI應用程序必須保證在處理任何一個請求時,現有的任何狀態都不能對後來的請求產生影響。另外,程序員在編寫CGI程序時,模塊化設計可以使主程序運行時對那些不經常用到的功能模塊相對「獨立",只有在需要時才被調入運行中,這樣可以加快主程序的運行。但是在轉向FastCGI應用時就要考慮盡量在一個程序段中完成相關的功能,以減少程序運行時產生的進程數,而且程序各功能塊之間又能充分地共享緩存。




[火星人 via ] 生根於自由的土壤——FastCGI已經有138次圍觀

http://www.coctec.com/docs/program/show-post-72467.html