標籤:
為什麼要用緩衝?
緩衝技術是提升系統效能最有效辦法。從作業系統的臨時交換區,到CPU的一二級緩衝,再到硬碟顯卡,緩衝技術幾乎無處不在。具體到web應用上,從你在瀏覽器地址欄裡鍵入地址並敲下斷行符號開始,到頁面呈現在你面前,這一次網路請求,沿途各處都用到了緩衝技術。DNS,路由器,負載平衡裝置,代理緩衝,web伺服器,瀏覽器等都以各種不同的形式在利用緩衝技術。
緩衝的作用
緩衝作為一種儲存介質,儲存上一次耗時計算的結果,當下一次相同的請求到來時,直接返回儲存的結果,不用再勞駕後端伺服器做一次重複勞動。這樣一來,後端伺服器的壓力減輕了,自然能提供更多的服務,這是典型的用空間換時間的做法。
緩衝的特性
有效期間是緩衝的必要屬性,當過了有效期間後,緩衝失效,重新計算結果並緩衝,進入下一個時效周期。
緩衝內容有變化時,需主動刪除緩衝。
PHP緩衝技術
從大的方向來說,PHP緩衝可分為編譯類緩衝、資料類緩衝、基於反向 Proxy的web緩衝和頁面靜態化
常用到的編譯緩衝工具有Apc,Accelerator,Xcache等,其原理是將指令碼編譯產生的opcode予以儲存,如果指令檔沒有修改,下次不用重新編譯(當然具體行為與配置有關)。
對於Apc來說,在php.ini中,將apc.ttl設定為0,則表示緩衝條目永不逾時,這意味著緩衝區滿後,將無法緩衝新條目,官方建議值為7200~86400。apc.stat選項表示是否啟用指令碼更新檢查。預設值1表示apc每次請求指令檔時都會檢查指令碼是否被更新,如果更新則重新編譯並緩衝,這樣做對效能有影響。如果設定為0,表示不檢查指令碼是否更新,這樣能大幅提高效能,但是假如指令檔更新了,則需要重啟web伺服器或者fcgi進程,預設值為1。
Apc的這種用法稱之為‘系統緩衝’,還有一種用法稱為‘使用者資料緩衝’,使用方式類似memcached,在此不再展開。
此類緩衝,主要指對變數、資料庫查詢結果等的緩衝。實現方式可以有多種,比如以資源id為鍵,或者以查詢語句為鍵來儲存,承載快取資料的載體則通常是memcached,redis和檔案等。
如Nginx的proxy_cache和fastcgi_cache,Apache2的mod_proxy和mod_cache,以及Squid和Varnish。嚴格來說,這並不屬於PHP緩衝,但是鑒於和PHP結合比較緊密,權且歸到一處來。
以Nginx舉例,其有兩種緩衝機制,proxy_cache和fastcgi_cache,兩者的區別:
proxy_cache作用是緩衝後端伺服器的內容,可能是任何內容,包括靜態和動態。
fastcgi_cache作用是緩衝fastcgi產生的內容,很多情況是php產生的動態內容。
proxy_cache緩衝減少了nginx與後端通訊的次數,節省了傳輸時間和後端頻寬。
fastcgi_cache緩衝減少了nginx與php的通訊次數,更減輕了php和資料庫的壓力。
也可稱之為頁面緩衝,可分為全頁面緩衝和頁面靜態片段快取。主要用到的技術為輸出控制。
ob_start();******要啟動並執行代碼*******$content = ob_get_contents();****將緩衝內容寫入html檔案*****file_put_contents(‘abc.html‘,$content);ob_end_clean();
這樣使用者直接存取abc.html即可。頁面靜態片段快取與此類似,可以用ob實現,也可以用ESI實現。還有一種情況,頁面的大部分內容是靜態,但是有一小部分內容是動態,這怎麼辦呢。這種情況我們把它歸屬於動態緩衝技術,我們下次再講。
PHP緩衝技術