讓PHP網站跑的更快---如何最佳化PHP
來源:互聯網
上載者:User
PHP是一種執行起來非常迅速的程式設計語言,但是比起僅僅最佳化代碼來說仍然值得最佳化PHP本身。
本文我們將根據一些實效闡述為什麼最佳化PHP本身要比最佳化代碼來的更貼切,以及為什麼需要理解根據PHP在你的伺服器上其他相關子系統的表現找出瓶頸並修複之。與此同時,我們也提到了如何最佳化您的PHP代碼來讓他們擁有更快的執行速度。
獲得高效能
當我們談及好的效能,往往不僅僅是指您的PHP代碼執行起來有多快。效能是一套在可量化評測和速度之間取出的平衡。僅僅依靠使用更少資源的代碼執行起來也許比在快取中之行的代碼更慢,並且相同的一組(在高速緩衝中執行的)代碼可以在同時並發執行在一台Web伺服器上。
在下面的例子中,A.php算作一位儘可能跑得快的賽跑選手,而B.php是一個幾乎可以以同一慢速永遠跑下去的馬拉松選手。輕負荷情況下,A.php可以充分的快,但是當流量增加後,B.php的效能表現將僅僅降低一點點而A.php會垮掉。
讓我們來通過一個事實來驗證此說法更深遠的本質意義。假設我們需要讀取一個250K的檔案並產生一個關於此檔案的HTML概要。我們寫了兩個指令碼來做同樣一件事:hare.php將一次性讀取整個檔案到記憶體中,然後一步執行到位;而tortoise.php每次唯讀取檔案的一行,並且決不超過內容容量。結果Tortoise.php因為多次讀寫需要更多的系統回應而慢得多。"
程式每執行一次,hare.php需要0.04秒CPU執行時間和10Mb的記憶體,而tortoise.php需要0.06秒CPU執行時間和5Mb的記憶體。伺服器共有100Mb實際記憶體容量並且其CPU有99%是閒置。我們同時假定執行這樣一個簡單事件不產生記憶體片段。
當有10各程式並發執行時,hare.php將發生記憶體溢出(10 ×10 = 100)。與此同時,tortoise.php仍將有50Mb空餘記憶體可用!11個程式並發執行將使hare.php徹底“潰敗”因為它開始需要使用虛擬記憶體——執行速度有可能降低到其常規速度的一半以下;而且現在每一個單獨程式進程需要0.08秒CPU執行時間。而此期間,tortoise.php仍舊運行在其常規CPU執行時間——0.06秒!
以下表格中,執行得更快的PHP指令碼使用粗體區分開來:
------------------------------------------------------------------------------------------
| 串連數 | 每執行1次HTTP請求所需CPU執行時間(秒)| 每執行10次HTTP請求所需CPU執行時間(秒)| 每執行11次HTTP請求所需CPU執行時間(秒)|
------------------------------------------------------------------------------------------
| hare.php | 0.04 | 0.04 | 0.88(記憶體溢出) |
------------------------------------------------------------------------------------------
| tortoise.php | 0.06 | 0.60 | 0.66 |
------------------------------------------------------------------------------------------
如您在上例中看到的,獲得更好的效能不再僅僅是寫出執行起來更快的PHP程式。高效能PHP表現需要對底層硬體知識以及作業系統、軟體支援如Web伺服器、資料庫等有一個良好認識和理解。
瓶頸
以上兩個例子讓我們看到了(效能)下降的瓶頸所在。當擁有無限大容量的記憶體時,hare.php的確是始終比tortoise.php快。但是,僅僅認為記憶體是PHP整體效能的瓶頸所在顯得過於單純——實際上遠不止這些:
(a) 網路
你的網路有可能是最大的瓶頸所在。如果你有10M的頻寬——最多你只能獲得1M/秒的傳輸速度。如果假設每個PHP頁為30k,那麼每秒僅僅只傳輸33頁就將使你的網路頻寬達到飽和。更多導致瓶頸產生的因素包括頻繁訪問低速DNS,或者網路裝置僅能獲得十分有限的儲存。
(b) CPU
如果你監視一下你的CPU負荷情況,發送一個純靜態HTML頁面並不會增加CPU負擔——就像我們以上提到的,此時瓶頸在於網路。當然啦,對於由PHP產生的複雜動態網頁面,你的CPU速度自然將成為限制因素之一。擁有包含多個CPU的伺服器或者一個伺服器陣列將減輕因CPU帶來的影響。