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按每行一個數字顯示。