PHP代碼優(yōu)化最佳實(shí)踐 編寫好的PHP代碼是創(chuàng)建快速穩(wěn)定Web應(yīng)用的關(guān)鍵一步。從一開(kāi)始就遵循一些最佳實(shí)踐技巧將節(jié)省后期填坑的時(shí)間。 1. 盡可能的使用PHP的內(nèi)置方法 只要可以盡可能的使用PHP的內(nèi)置方法,而不是自己編寫相同功能的方法?;c(diǎn)時(shí)間去熟悉和學(xué)習(xí)PHP的內(nèi)置方法,不但可以幫助你更快的編寫代碼,而且可以使你編寫的代碼更高效的運(yùn)行。 2. 使用Json替代xml json_encode()和json_decode() 等PHP的內(nèi)置方法,運(yùn)行速度都非??欤袘?yīng)該優(yōu)先使用Json。如果你無(wú)法避免使用xml,那么請(qǐng)務(wù)必使用正則表達(dá)式而不是DOM操作來(lái)進(jìn)行解析。 3. 使用緩存技術(shù) Memcache特別適用于減少數(shù)據(jù)庫(kù)負(fù)載,而像APC或OPcache這樣的字節(jié)碼緩存引擎在腳本編譯時(shí)可節(jié)省執(zhí)行時(shí)間。 4. 減少不必要的計(jì)算 當(dāng)一個(gè)變量會(huì)被多次使用時(shí),一開(kāi)始就計(jì)算好,肯定要比每次使用時(shí)都計(jì)算一遍要更高效。 5. 使用isset()和empty() 與count()、strlen()和sizeof()函數(shù)相比,isset()和empty()對(duì)于檢測(cè)一個(gè)變量是否為空等場(chǎng)景更加簡(jiǎn)單和高效。 6. 減少不必要的類 如果你不打算重復(fù)使用一個(gè)類或者方法,那么它就沒(méi)什么存在的價(jià)值。而如果你必須要定義和使用一個(gè)類,則需要合理規(guī)劃類中的方法,對(duì)于不是特別公用的方法,盡量將他們放到子類中去,因?yàn)檎{(diào)用子類中的方法,比調(diào)用父類方法速度更快。 7. 在生產(chǎn)環(huán)境關(guān)閉用作調(diào)試的相關(guān)代碼及錯(cuò)誤報(bào)告 開(kāi)發(fā)時(shí)打開(kāi)錯(cuò)誤報(bào)告,可以讓你避免很多潛藏的Bug,而一些調(diào)試代碼也有助于你定位Bug,但是當(dāng)代碼部署到生產(chǎn)環(huán)境后,這些錯(cuò)誤報(bào)告和調(diào)試代碼會(huì)拖慢你的程序速度,而且將一些錯(cuò)誤報(bào)告直接顯示給用戶,也具有相當(dāng)?shù)陌踩L(fēng)險(xiǎn)。因此,在生產(chǎn)環(huán)境請(qǐng)關(guān)閉它們。 8. 關(guān)閉數(shù)據(jù)庫(kù)連接 當(dāng)使用完畢后,注銷變量和關(guān)閉數(shù)據(jù)庫(kù)連接,可以釋放珍貴的內(nèi)存資源。 9. 使用聚合函數(shù)減少數(shù)據(jù)庫(kù)查詢 查詢數(shù)據(jù)庫(kù)時(shí),使用聚合函數(shù),可以減少檢索數(shù)據(jù)庫(kù)的頻率,并且使程序運(yùn)行的更快。 10. 使用強(qiáng)大的字符串操作函數(shù) 舉個(gè)例子,str_replace()比preg_replace()要快,而strtr()函數(shù)則比str_replace()函數(shù)快四倍。 11. 盡量使用單引號(hào) 如果可能,盡量使用單引號(hào)替代雙引號(hào)。程序運(yùn)行時(shí),會(huì)檢查雙引號(hào)中的變量,這會(huì)拖慢程序的性能。 12. 嘗試使用恒等運(yùn)算符 由于“===”僅檢查閉合范圍,因此比使用“==”進(jìn)行比較速度更快。 PHP代碼之外的性能瓶頸因素 優(yōu)化代碼當(dāng)然能夠提高PHP的性能。但是,還有一些代碼之外的因素也會(huì)成為PHP的性能瓶頸。這就是為什么程序員需要了解代碼部署的整個(gè)服務(wù)器環(huán)境,這有助于他們?cè)诰帉懘a時(shí)有一定的心理準(zhǔn)備,并能夠在性能出現(xiàn)問(wèn)題時(shí),快速識(shí)別和定位性能瓶頸。以下是你遇到性能瓶頸時(shí)需要檢查的點(diǎn)。 1. 網(wǎng)絡(luò)帶寬 如果網(wǎng)絡(luò)帶寬不夠,其傳輸?shù)目倲?shù)據(jù)量將會(huì)受到嚴(yán)重影響,使其成為最明顯的性能瓶頸。 2. CPU 如果只是傳輸一些純靜態(tài)的HTML,則不需要消耗很多CPU資源,但是PHP畢竟創(chuàng)建的是動(dòng)態(tài)的應(yīng)用程序,根據(jù)應(yīng)用的需要,你可能至少需要一臺(tái)具備多核處理器的服務(wù)器來(lái)提升PHP代碼的運(yùn)行效率。 3. 共享內(nèi)存 缺少共享內(nèi)存可能會(huì)影響進(jìn)程間通信,從而影響程序性能。 4. 文件系統(tǒng) 隨著時(shí)間推移,你的文件系統(tǒng)可能會(huì)出現(xiàn)大量磁盤碎片。如果內(nèi)存足夠,利用內(nèi)存作為文件緩存可以加快磁盤的訪問(wèn)速度。 5. 進(jìn)程管理 檢查服務(wù)器的進(jìn)程,確保里面沒(méi)有非必要的進(jìn)程。移除哪些不需要的網(wǎng)絡(luò)協(xié)議、病毒掃描軟件、郵件服務(wù)以及硬件驅(qū)動(dòng)。將PHP代碼運(yùn)行在多線程模式,也能提高程序的響應(yīng)時(shí)間。 6. 相關(guān)的其它服務(wù) 如果你的應(yīng)用程序還依賴于一些外部服務(wù),那這些外部服務(wù)的性能瓶頸也有可能拖慢你的應(yīng)用。雖然這種情況下你能做的事情不多,但你仍然可以通過(guò)你這一邊的操作來(lái)減輕外部服務(wù)性能瓶頸對(duì)你的影響,例如切換到備用服務(wù)上等。 |
|