本文提出了實用的PHP的最佳化,緩衝,壓縮實際的解決方案。
作為流行的Web 程式語言, PHP 的最大優勢就是速度。 PHP4 已經在這方面做的非常好了,你幾乎找不到比它更快的腳本程式語言了。但如果你的應用負載很大,而頻寬又比較小,或者有其他的瓶頸影響你的伺服器效能,那麼,你不妨試試筆者為你開出的幾個藥方,看看是否靈驗。
一、程式碼優化
一談到程式碼最佳化,或許你想到的就是整齊明了的程式碼,但是本文的意思卻不是在此,因為如果要尋求速度的話,就要對PHP 源碼作相應的調整。一般說來就是去掉多餘的註釋,讓程式碼無法讀。但這對於一個具有良好素養的程式設計師來說,簡直就是不可思議的。還好Zend Technologies 公司發表了Zend 優化引擎可以幫助你做到這一點。現在它是免費的,但是你必須遵循Zend Optimizer 許可。這個產品可以對引擎產生的中間程式碼進行最佳化。
安裝這個引擎比較簡單,下載對應平台的版本以後,解開壓縮文件,然後在php.ini 文件裡面加上下面兩行,重新啟動Web 伺服器,就搞定了。
zend_optimizer.optimization_level=15
zend_extension="/path/to/ZendOptimizer.so"
zend_loader.enable=Off
如果是Win32 平台的話就應該是:
zend_optimizer.optimization_level=15
zend_extension_ts="C:path o endOptimizer.dll"
zend_loader.enable=Off
啊!沒有搞錯吧?怎麼是三行?其實第三行是可選的。因為看起來把zend_loader 關掉能提高一點速度,所以值得把這第三行放到php.ini 。要注意的是,關掉的前提條件是你沒有在使用Zend 加密程式。
二、緩衝
如果想要更進一步提升速度,我們就需要考慮採用緩衝技術了。有一些可選的解決方案,包括Zend Cache (測試版本), APC, 以及Afterburner Cache,另外還有jpCache 等。
以上這些都是屬於緩衝模組,他們把第一次對.php 檔案請求產生的中間程式碼儲存在Web 伺服器的記憶體中,然後對以後的請求傳回「編譯好」的版本。因為這樣減少了磁碟讀寫,而且都在記憶體工作,所以這個過程能顯著提升應用效能,
現成的這類產品比較多,到底選擇誰呢?
Zend Cache 是一款不錯的商業產品,第一次加載那些很大的PHP 頁面後,你會明顯感受到速度的提升,伺服器會留出更多的資源。可惜這個產品是要花銀子的,但是在有些情形下,你可不要吝嗇這些銀子。
Afterburner Cache 是Bware Technologies 的產品,目前還處於Beta 版本,看起來似乎和Zend Cashe 一樣,但是它不能達到Zend Cache 那樣好的效果,也不能和Zend 優化引擎一起工作,但是它是免費的,所以我採用了這個模組。
APC (Alternative PHP Cache) 是Community Connect 發布的另一個免費模組,看起來似乎可以用於生產環境了。
三、Web 內容壓縮
對於日益擁擠的網路來說,節約頻寬就像節約用水一樣是十分值得提倡的。根據IETF 標準,大多數瀏覽器應該支援使用gzip 壓縮的內容。也就是說你可以把用gzip 壓縮的內容傳送給瀏覽器,瀏覽器會透明的解壓縮資料。
mod_gzip 是Remote Communications 公司推出的免費Apache 模組,能把靜態的Web 內容壓縮後傳送給瀏覽器。對大多數靜態網頁來說,這個模組十分適合。儘管
Remotecommunications 公司的人說這個模組支援所有那些mod_php, mod_perl,mod 什麼產生的動態內容,但是看起來還是不能工作,從mod_gzip 的郵件列表來看,這個問題估計要到1.3.14.6f 才能解決。
如果要壓縮動態內容的話,我們可以採用class.gzip_encode.php,一個在腳本開始和結束時使用的PHP 類別。對整個網站來說就是在php.ini 的auto_prepend 和auto_append 中呼叫其中的函數。詳細你可以閱讀這個類別的程序,這個程序註解得很好,作者幾乎把什麼都告訴你了。不過使用之前,你的PHP 要編譯為支援zlib。
對於PHP 4.0.4 來說,一個新的解決方案就是使用ob_gzhandler,能達到和上面的類別一樣的效果,只要簡單的在php.ini 加入下面這句話就可以了:
output_handler = ob_gzhandler ;
這能讓PHP 啟動輸出緩衝,並壓縮所有輸出。如果有什麼特殊的理由不想讓所有的內容都壓縮輸出的話,可以採用在.htaccess 檔案中加入下面的行,對對應目錄下的檔案進行壓縮。
php_value output_handler ob_gzhandler
也可以直接在PHP 程式碼中加入:
ob_start("ob_gzhandler");
這項壓縮技術十分有效,但是對Netscape Communicator 用戶來說,因為不能壓縮圖形文件,所以看上去沒有停完?姆⑺?虼吮匭牘乇斬?jpeg 和gif 檔案的壓縮,IE 沒有這個問題。
結論:
採用本文所討論的技術應該能改善你的網站效能,但是需要注意的是:
- PHP 可能不是導致瓶頸的原因,仔細檢查其他原因(例如:資料庫)
- 你不可能把伺服器效能調節到最高狀態。因此在埋怨PHP 及其緩衝之前,考慮是否該升級伺服器了,或者採用動態負載平衡技術(那可是一大筆銀子哦)。
- 不要低估內容壓縮,在你100 Mb 的內部網上面看到PHP 應用的速度提升時,不要忘記使用調製解調器的用戶在哪裡埋怨你的100Kb 的HTML 頁面。