PHP運行模式____PHP

來源:互聯網
上載者:User

原文地址:

http://www.latrell.me/post-376.html

概述

PHP運行模式,就是PHP的執行方式,一種是獨立的可執行程式(通常是exe程式),一種是以模組的形式嵌入到伺服器程式裡運行(通常是DLL程式)。

技術

獨立執行,用到的是CGI(Common Gateway Interface,通用閘道介面)技術;而另外一種,在IIS裡被稱為ISAPI(Internet Server Application Programming Interface,網際網路伺服器應用程式介面),Apache裡則被稱為Module(模組),比較通俗一點。通常來講,技術的執行就叫做模式,CGI是一種技術也是一種模式。

IIS: CGI/ISAPI
Apache: CGI/Module 兩種方法的區別

在CGI模式下,當收到一個匹配URL的請求,相應的程式就會被調用,並將用戶端發送的資料作為輸入;
而在模組化(DLL)中,PHP是與Web伺服器一起啟動並啟動並執行;
在CGI中,執行程式與伺服器程式各自獨立,當執行程式出現錯誤時,伺服器程式不會受到影響,但會佔用更多的資源。
所以,CGI比DLL有更好的穩定性和安全性,而DLL則有更好的執行效率和速度。 FastCGI

FastCGI的引入就是為瞭解決CGI的效能問題,嚴格來說,FastCGI也是CGI的一種,它在保留CGI的穩定性的同時,結合了DLL的優點。

FastCGI是語言無關的、可伸縮架構的CGI開放擴充,其主要行為是將CGI解譯器進程保持在記憶體中並因此獲得較高的效能。眾所周知,CGI解譯器的反覆載入是CGI效能低下的主要原因,如果CGI解譯器保持在記憶體中並接受FastCGI進程管理器調度,則可以提供良好的效能、伸縮性、Fail-Over特性等等。

普通cgi的工作流程:
web server收到使用者請求,並把請求提交給cgi程式,cgi程式根據請求提交的參數作相應處理,然後輸出標準的html語句返回給web server,web server再返回給用戶端,這就是普通cgi的工作原理。

從上面看,cgi所要實現的不過是動態網頁而已,這種處理方式的特點就是每接到一個請求,web server都要fork出一個單獨的cgi程式的進程來處理,這種方式的好處是把web server和具體的程式處理獨立開來,結構清晰,可控性強,同時缺點就是如果在高訪問需求的情況下,cgi的進程fork就會成為很大的伺服器負擔,想 象一下數百個並發請求導致伺服器fork出數百個進程就明白了。這也是為什麼cgi一直背負效能低下,高資源消耗的惡名的原因。

相應的有問題就有解決方案,目前流行的方案就是使用模組設計,基本上目前的web server都有相應的模組機制來擴充它的功能, 只要按照其設計規範設計出來的模組,就能插入到web server自身的進程處理,因此效能有很大改觀,例如IIS的isapi,apache的dso。但是,這種方法也不是沒有缺點的,例如對於不同的 web server,要按照不同標準開發,無法做到webserver無關性;例如這將輸入驗證的工作轉交給了web server,沒辦法自由處理;例如一旦出現問題將影響整個web server處理流程;例如插入web server進程導致的無法以多使用者標示運行,無法處理虛擬機器主機許可權等。

所幸我們還有另外的選擇,這就是fastcgi。fastcgi是基於cgi架構的擴充,他的核心思想就是在web server和具體cgi程式之間建立一個智能的可持續的中介層,統管cgi程式的運行,這樣web server只需要將請求提交給這個層,這個層再派生出幾個可複用的cgi程式執行個體,然後再把請求分發給這些執行個體,這些執行個體是可控的,可持續,可複用的, 因此一方面避免了進程反覆fork,另一方面又可以通過中介層的控制和探測機制來監視這些執行個體的運行情況,根據不同的狀況fork或者回收執行個體,達到靈活 性和穩定性兼得的目的。

有人曾經做過測試,使用cgi方式運行php效率最差,mod_php方式效能非常不錯,幾乎是cgi方式的50倍,但是無法保證虛擬機器主機網站的安全性隔離,而fastcgi效能則基本和mod_php相當,這還是在使用了suexec切換虛擬機器主機網站運行使用者的情況下的結果。 為什麼要使用FastCGI,而不是多線程CGI解譯器。

這可能出於多方面的考慮,例如:

1、你無論如何也不能在windows平台上穩定的使用多線程CGI解譯器,無論是IIS ISAPI方式還是APACHE Module方式,它們總是運行一段時間就崩潰了。奇怪麼。但是確實存在這樣的情況。
當然,也有很多時候你能夠穩定的使用多線程CGI解譯器,但是,你有可能發現網頁有時候會出現錯誤,無論如何也找不到原因,而換用FastCGI方式時這種錯誤的機率會大大的降低。我也不清楚這是為什麼,我想獨立地址空間的CGI解譯器可能終究比共用地址空間的形式來得穩定一點點。

2、效能。效能。可能麼,難道FastCGI比多線程CGI解譯器更快。但有時候確實是這樣,只有測試一下你的網站,才能最後下結論。原因嘛,我覺得很難講,但有資料說在Zend WinEnabler的時代,Zend原來也是建議在Windows平台下使用FastCGI而不是IIS ISAPI或Apache Module,不過現在Zend已經不做這個產品了。 不使用FastCGI的理由

1、多進程比多線程消耗更多的伺服器記憶體,php-cgi.exe解譯器每進程消耗7至25兆記憶體,將這個數字乘以50或100試試。

2、效能。確實有時候多線程CGI解譯器更快,呵呵,而且有時候,它也很穩定。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.