一、采用基准測試,檢測代碼的性能
基准測試涉及Web應用程序時,通常指“壓力測試”,即在你的代碼中盡可能多地加載流量,然後衡量它的執行能力。
推薦兩種基准測試的工具:ApacheBench(ab)和JMeter。
要進行壓力測試,我們需要兩個東西:同時在線的用戶和大量的請求。使用這些工具後,很多同時運行的應用程序線程便代表了用戶。因此我們只需記住:並發線程=並發用戶。
1、ApacheBench超級簡單,通常包含了Apache安裝,或是作為Apache開發包的一部分——一個被稱為簡單ab的二進制文件。要使用ab,只需指定請求的總數(-n),以及並發線程的數量(-c),然後讓它開始工作。
例如:我們在這裡使用-n 1000 -c 20生成20個並發線程執行1000個請求。
$ ab -n 1000 -c 20 http://example.org/
ab使用參考:http://httpd.apache.org/docs/2.0/programs/ab.html
2、JMeter是另一個具備GUI的Apache項目,而且具備更多功能。若要使用JMeter,你需要創建一個測試計劃,添加線程組、添加采樣器、指定JMeter的配置、添加Cookie處理器這樣的其他選項、增加監聽器處理結果。
JMeter網站:http://jmeter.apache.org/
二、利用緩存提高代碼性能
1、對於Apache服務器,利用apc實現代碼緩存。
從PECL(PHP Extension Community Library,PHP擴展共享類庫)中獲取APC進行編譯,然後安裝該擴展。
$ pecl install apc
在這之後,根據設置,需要編輯php.ini文件並添加它:
extension = apc.so
重新啟動Apache,然後就可以了。
apc使用參考:http://www.php.net/manual/en/book.apc.php
2、對於Windows/IIS服務器,利用微軟的WinCache實現代碼緩存。
WinCache網站:http://www.iis.net/downloads/microsoft/wincache-extension
3、利用memcached實現會話數據緩存,memcached是基於內存的、群集友好的鍵/值對存儲。如果你啟用memcached擴展,就可以自動使用memcached代替磁盤存儲回話。
memcached網站:http://memcached.org/
memcached使用參考:http://www.php.net/manual/zh/book.memcached.php
安裝memcached:
$ pecl install memcache # Install ext/memcache $ memcached -d -m 128 # Start memcached
設置php.ini:
session.save_handler = 'memcache' session.save_path = 'tcp://localhost:11211'
三、進行程序概要分析,尋找問題在哪裡?
程序概要分析(profiling)是采用精確的時間或內存檢測代碼運行每個動作的行為。通過分析,找到問題的位置,然後進行優化。
我們有兩個常用的profiling工具:
1、由Derick Rethans編寫的可靠的Xdebug工具,並由KCachegrind或QCachegrind審核結果。
Xdebug網站:http://xdebug.org/
KCachegrind網站:http://sourceforge.jp/projects/freshmeat_kcachegrind/releases/
QCachegrind網站:http://sourceforge.jp/projects/freshmeat_kcachegrind/releases/
2、新開發的XHProf工具,是來自Facebook的一個應用,由Paul Reinheimer編寫XHGui Web前段部分。
XHProf網站:http://pecl.php.net/package/xhprof
XHGui網站:https://github.com/perftools/xhgui
總結:
首先我們要解決性能下降這個最大的難題,這樣便可獲得整體性能的更好提升。如果一個SQL查詢花費10秒,而你將它的執行速度提高了50%,這樣你為自己節省了5秒;然而,如果執行一個PHP函數花費5秒,你同樣將它的執行速度提高了50%,你實際上卻只節省了半秒鐘。在某些時候,你將受到硬件性能的絕對限制,以我們的經驗你更有可能受到磁盤或網絡I/O的限制,而不是CPU或RAM的限制。這時你需要開始在多台計算機上縮放應用程序。