PHP程式最佳化
Php程式最佳化的內容比較多,下面重點介紹PHP代碼最佳化、Session機制最佳化、使用緩衝中介軟體以及PHP代碼緩衝系統(主要是APC加速)幾個部分。
最佳化PHP代碼
只有在掌握足夠多的技巧之後,我們才能對PHP代碼經行最佳化。當程式編碼工作完成之後,我們通常會讓一些比較資深的程式員來對代碼進行審查,評估程式的品質並找出需要最佳化的點,這個過程也叫做 Code Review。下面我們來介紹一些比較常見的PHP編程技巧,以及 Code Review 過程中可能涉及到的一些最佳化原則。
1、升級到最新的PHP版本
要知道,程式設計語言本身也是不斷髮展的,新版的語言通常會包含語言自身的漏洞修補和效能最佳化。因此作為專業人士,我們需要定期關注新版本的出現,對於PHP來說,我們可以從官網 http://php.net/上擷取到所需資訊。
2、減少include 和 require
雖然PHP本身已經對這個問題做過一定的最佳化,但是在大量使用方式下有可能會造成效能的下降。這個過程可以採用安裝APC加速器組件的方法來緩解。
3、使用局部變數代替全域變數
局部變數的速度是最快的,特別是在一些迴圈邏輯中,我們儘可能的使用局部變數來進行運算。至於為什麼不用全域變數,一方面是因為運行效率的問題,另一方面則是考慮到全域變數不易於2管理。
4、盡量使用靜態函數或方法
如果有可能我們應該盡量把函數或者方法定義成靜態,即加上 static 標記,這樣有可能會讓程式執行的速度提升好幾倍。
5、釋放那些不用的變數或者資源
不要過分的依賴PHP的記憶體回收機制,程式中一些用不到的變數或者資源應該及時的釋放,我們可以使用 unset 方法,或者直接將其設定為 null。另外,如果遇到其他和組件相關的資源更要特別注意,比如資料庫連接。
6、使用單引號替代雙引號來包含字串
在PHP中,字串通常使用單引號來包含,因為使用雙引號可能會額外產生字元轉義甚至變數解析的邏輯,單引號的執行效率要比雙引號高。
7、使用@符號屏蔽錯誤會降低指令碼運行速度
為了使用方便,某些程式員喜歡使用@來屏蔽錯誤資訊,但是這種做法會降低指令碼的運行速度,不推薦使用。
8、不要過度使用PHP的 OOP
為了能更好的管理代碼,現在比較大型的PHP程式都更傾向使用物件導向思想(OOP)來構建程式架構,但是由於對象通常比較佔用記憶體,類庫太多還有可能產生大量的include 和 require 操作,從而造成額外的開銷。因此,我們要根據實際情況合理使用OOP思想。這個問題同樣可以使用APC加速組件來緩解。
9、使用抽象類別代替介面
在PHP中使用介面(inteerface)的成本非常高,編程時盡量避免使用。類似的邏輯封裝我們通常可以使用抽象類別(abstract class)來代替。
10、使用Regex代價昂貴
雖然,PHP語言的Regex功能非常強大,但我們需要知道它的執行成本同樣高昂,在可能的情況下,應該盡量使用PHP的字元處理函數來代替。
11、儘可能的壓縮需要儲存的資料
任何資料的儲存都需要佔用系統的空間資源,所以在可能的範圍內應該盡量對資料經行壓縮,從而節省系統的空間資源。比如,我們儲存IP地址時可以使用ip2long函數把IP地址轉化為整型資料來儲存,然後再通過long2ip函數還原。另外,對一些大資料還可以使用gzcompress 和 gzuncompress 進行壓縮和解壓。
12、使用更高效的語句
PHP編程語句的效率也有高低之分,下面我們對其比較重要的語句進行對比,以後大家在寫代碼時需要注意。
- 分支語句中 switch...case 的效率高於 if...elseif...else
- 迴圈語句中 foreach 的效率最高,for 其次,while 最低
- 疊加語句語句中 ++$i(首碼) 的寫法快於 $i++(尾碼)
13、使用更高效的函數
PHP的函數庫非常豐富,相同的功能可以使用不同的函數來完成。不過,不同函數的運行效率也有不同,我們在使用是需要注意,下面我們對一些常用函數進行對比。
- 字元列印函數 echo 快於 print
- 字元替換函數 strtr 效率最高,str_replace 其次,prea_replace 正則替換最低
- 數組查詢函數 array_key_exists 最快,inset 其次,in_array 最低
- 擷取遠程網路檔案 cUrl 效率和可操作性、靈活性最高,fsockopen 次之,file_get_contents 和 fopen 最低
雖然,對於某些邏輯不是很複雜的程式來說,也許每次代碼最佳化的效果並不是非常明顯,但是養成良好的編程習慣是非常重要的,這也是普通程式員和進階程式員之間的差別。上面所列並非所有的PHP編程技巧,況且要掌握這些技巧也不是一朝一夕所能完成的;所謂學海無涯,只有在學習和動手的過程中不斷總結積累,才能讓自己的編程能力更上一層樓。
PHP最佳化Session機制
簡單來說,Session就像每個使用者內建的全域變數,用於儲存使用者在在服務端需要儲存的任何資訊。實際上,Session會話的功能都可以在系統設定檔php.ini中設定,當然我們也可以使用 ini_set 函數(ini_get 擷取配置)從程式上進行設定。
一般不建議啟用auto_start(session.auto_start:是否自動啟用) ,因為建立Session需要消耗系統資源,我們通常只會在需要用到Sesson時,才會使用session_start函數來開啟Session功能。其次,Session的有效期間需要根據系統的情況而定。如果太長,有可能導致會話資料太多造成負載問題;而加入太短,也有可能由於會話建立過於頻繁而出現效能問題。系統預設的有效時間為1440秒,也就是24分鐘,在實際項目中我們通常會將這個時間設定在1-8小時之間。此外還需注意的是,PHP Session 使用的預設儲存方式是檔案儲存體,在php.ini中我們可以通過session.save_handle選線來選擇需要的儲存方式,但是使用檔案儲存體方式的效率比較低,也不利於系統架構擴充,在實際項目中經常通過session_set_save_handler方法來設定Session回調介面,用於控制Session會話的邏輯,常見的儲存介質有資料庫、分布式快取服務器等。
PHP Session 的最佳化思路。首先,每次建立Session時都會產生資源消耗,千萬不要想當然在全域設定檔中使用session_start 方法。其次,每次會話請求都需要確保帶上Session ID,因為服務端擷取不到Session ID的話,將會重新建立一個。另外,選擇儲存方式時,盡量使用快速的儲存介質,比如快取伺服器Memcache(d)、Redis等。
使用緩衝中介軟體
緩衝中介軟體的出現,是為了把查詢到的資訊緩衝在伺服器記憶體中,來替代資料庫處理大部分的查詢要求,從而減輕資料的壓力。目前業內比較常用的緩衝中介軟體為 Memcache 和 Redis(兩者的環境搭建和用法以及區別,讀者請尋找網路資源,此處不做詳細介紹) 。根據實際項目中使用的效果,緩衝中介軟體通常能極大提高服務端的查詢速度。另外,Redis緩衝還可作為寫入隊列來使用,即先把資料寫入到Redis緩衝中,然後再轉存到資料中去。
使用APC加速
隨著網路應用的不斷髮展,邏輯代碼也變得越來越複雜,並且架構中引入龐大類庫代碼的資源消耗也比較高,因此再上線時。我們還需要使用一些代碼層級的緩衝來加速代碼的執行。
APC(Alternative PHP Cache,PHP代碼緩衝系統)是非常好的PHP代碼緩衝解決方案,通過緩衝和最佳化PHP中間碼(opcode)來提高PHP的執行效率。
註:與 APC 同層級的免費的 PHP代碼緩衝技術還有 eAccelerator 和 XCache( 安裝及區別:http://blog.csdn.net/mossader/article/details/6343354)
最佳化資料轉送
1、最佳化json協議
在通訊協定的通用設計原則中,通用性和間接性是最重要的。選擇JSON協議作為程式應用協議的基礎本身就是對系統的一種最佳化。
2、使用gzip壓縮
資料從服務端到用戶端的過程需要通過複雜的網路,因此影響網路傳輸的主要因素有兩個,其一網路品質,其二資料本身的大小。對於HTTP協議來說,gzip是目前的主流壓縮演算法之一,大部分的HTTP伺服器都支援這種壓縮演算法(關於Apche、Nginx 配置gzip壓縮功能模組,請 自行尋找網路資源)
未完待續……
註:本文摘錄自《Android 和 PHP 開發最佳實務》第九章:服務端最佳化(有刪改)
以上就介紹了PHP程式最佳化,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。