天天看點

加速你的網絡應用

平時我們希望提高應用的響應速度時,常用的有以下一些方法:

使用Gzip 減少Http Request次數 增加過期頭資訊 Expire Header 壓縮CSS和Javascript檔案

1、第一條是使用Gzip。

在Codeigniter中,我們可以很友善的在 application/config/config.php 中打開 $config[‘compress_output’] = TRUE 這個選項,這樣通過 view 輸出的内容自動的就會進行gzip壓縮。我對比了一個原來為24kb的首頁,壓縮後隻有6.5k,可以說效果非常明顯。

但是Codeigniter的gzip壓縮選項打開後,view中輸出時就不能再有 echo 語句,否則會發生如下的錯誤:

Fatal error: ob_start() [ref.outcontrol]: Cannot use output buffering in output buffering display handlers in

我這裡的解決辦法是使用 ini_set 設定全局的PHP變量,預設打開檔案壓縮。因為懶得改代碼中的 echo 了,如果比較容易修改,可以改為使用 set_output 進行替換,也不會有問題。

擴充:

打開這個選項後,實際上我們隻能壓縮PHP腳本輸出的部分,而現在網站中的CSS和JS檔案也不小,是以對這一部分進行壓縮也是比較必要的。這首先需要我們的伺服器支援 gzip 壓縮,這裡我隻是考慮 apache 2.x 的情況,apache 1.3 和 IIS 的情況,可以 Google 之。

下面這個方法是在 Linux 和 Apache 的環境下實驗通過,需要有修改 php.ini 和 .htaccess 檔案的權限。

a、首先檢查伺服器是否支援GZIP。使用phpinfo()列印伺服器資訊,檢視 _ENV["HTTP_ACCEPT_ENCODING"] and HTTP_ACCEPT_ENCODING 看是否包含 gzip。

b、確定 apache 的 mod_deflate 子產品已經激活。

c、在項目的 .htaccess 檔案中加入下面的語句,apache 伺服器就會自動幫你壓縮你希望進行壓縮的檔案

AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/javascript

在 apache 1.3 中,可以使用 mod_gzip 進行壓縮,具體的設定方式就不贅述了。另外,試驗中發現,如果 apache 伺服器以 FastCGI 的方式來解析 PHP,上面這種設定會失效。具體的原因和解決方法還沒找到相應的資料。

我們的一個項目中,使用了HostMonster的虛拟主機,Google搜到了一些文檔,據說可以在HostMonster的虛拟主機上配置打開Gzip的選項,多次試驗也沒成功,後來咨詢了HostMonster的從業人員,确認了雖然伺服器上有mod_deflate子產品,但并不是給消費者使用的,我那個氣憤呀。

2、減少Http的請求次數

使用者的帶寬是非常有限的,如果你的網站上有衆多的小檔案,則每個檔案請求建立連接配接、下載下傳這個三次握手的過程是非常消耗使用者的帶寬資源的,是以可以使用一些技術來将多個檔案合并為一個檔案一次下載下傳。

可以使用 Css Sprite 的技術,将頁面中需要的小圖示 icon 類集中在一個檔案中。因為每個圖示的大小一般都很小,大概都不超過 2-3 kb ,整合成一個檔案仍能夠将檔案大小控制在合理的範圍之内。

3、減少JS和CSS檔案的尺寸

随着網絡應用的豐富,現在網頁中的引用的JS和CSS檔案越來越多,也越來越大。我們平時在程式設計的時候,為了浏覽的美觀與友善,會對代碼進行格式化,增加注釋和空行,使用有意義的變量名等。實際上對于浏覽器來說,解析和執行這些檔案是不要保留這些格式的,是以對JS和CSS檔案進行一些壓縮的處理就可以達到減少檔案尺寸的目的。

4、設定過期的頭資訊

在Codeigniter中,可以通過調用 $this->output->set_header(); 來設定頭資訊。進而控制浏覽器如何決定來處理已經被緩存的内容。

參考資料: