摘要:怎樣才算是高性能的應用性能和速度不是一對同義詞。紅線表示針對速度進行了優化的腳本,藍線是可擴展性優先的腳本。將任何這些功能置于循環中可能會導致性能問題。完整的代碼檢測評估雖然可能很耗時,但它可以為你提供有關應用程序性能的深入信息。
程序員都喜歡最新的PHP 7,因為它使PHP成為執行最快的腳本語言之一(參考PHP 7 vs HHVM 比較)。但是保持最佳性能不僅需要快速執行代碼,更需要我們知道影響性能的問題點,以及這些問題的解決方案。本文涵蓋了保障PHP應用平穩高速運行的所有知識點,大量干貨來襲,強烈建議收藏。
PHP是由拉斯姆斯·勒多夫于1995年開始開發的。起初,它只是勒多夫為了要維護個人網頁,而用c語言開發的一些CGI工具程序集,我們從PHP這個縮寫最初的來源“Personal Home Page”(個人主頁)就可以看出這一點。然而,隨著勒多夫不斷地擴充它的功能,PHP逐漸成為了現在的“PHP:超文本預處理器”。
在過去的20年中,PHP的開發團隊一直致力于提升PHP的性能,最引人矚目的是于1999年引入的Zend語法解釋器引擎。2000年發布的PHP 4,包含了一個內建的編譯器和執行器模型,使得PHP開始有能力開發動態的Web應用。2015年PHP發布了里程碑式的版本PHP 7.0,極大的提升了Zend引擎的性能,并降低了PHP的整體內存使用率。截止到本文發稿為止,目前最新的PHP版本是7.1.4,有興趣的話可以看看這篇文章PHP7 新特性,改變變化。
怎樣才算是高性能的PHP應用?性能和速度不是一對同義詞。實現最佳性能通常需要在速度、準確性和可擴展性之間進行權衡。例如,在開發Web應用時,如果你優先考慮速度,你可能會編寫一個將所有內容都載入內存的腳本,而如果從可擴展性出發,可能你就會編寫以塊為單位將數據載入內存的腳本。
基于phpLens的研究,下圖展示了速度與可擴展性之間理論上的權衡關系。
紅線表示針對速度進行了優化的腳本,藍線是可擴展性優先的腳本。當并發連接數低時,紅線運行速度更快; 然而,隨著并發連接數量的增加,紅線變慢。當并發連接數上升時,藍線也減慢;然而,下降并不那么劇烈,因此,在一定閾值后,速度優先的腳本會比可擴展性優先的腳本慢。然而,在現實當中,一些腳本可能隨著運行環境的變化而表現出前后不同的性能差異。你需要仔細的觀察用戶的使用情況,以及應用的并發請求數量,來適時調整合適的優化策略。
PHP代碼優化最佳實踐編寫好的PHP代碼是創建快速穩定Web應用的關鍵一步。從一開始就遵循一些最佳實踐技巧將節省后期填坑的時間。
1. 盡可能的使用PHP的內置方法只要可以盡可能的使用PHP的內置方法,而不是自己編寫相同功能的方法?;c時間去熟悉和學習PHP的內置方法,不但可以幫助你更快的編寫代碼,而且可以使你編寫的代碼更高效的運行。
2. 使用Json替代xmljson_encode()和json_decode() 等PHP的內置方法,運行速度都非???,所有應該優先使用Json。如果你無法避免使用xml,那么請務必使用正則表達式而不是DOM操作來進行解析。
3. 使用緩存技術Memcache特別適用于減少數據庫負載,而像APC或OPcache這樣的字節碼緩存引擎在腳本編譯時可節省執行時間。
4. 減少不必要的計算當一個變量會被多次使用時,一開始就計算好,肯定要比每次使用時都計算一遍要更高效。
5. 使用isset()和empty()與count()、strlen()和sizeof()函數相比,isset()和empty()對于檢測一個變量是否為空等場景更加簡單和高效。
6. 減少不必要的類如果你不打算重復使用一個類或者方法,那么它就沒什么存在的價值。而如果你必須要定義和使用一個類,則需要合理規劃類中的方法,對于不是特別公用的方法,盡量將他們放到子類中去,因為調用子類中的方法,比調用父類方法速度更快。
7. 在生產環境關閉用作調試的相關代碼及錯誤報告開發時打開錯誤報告,可以讓你避免很多潛藏的Bug,而一些調試代碼也有助于你定位Bug,但是當代碼部署到生產環境后,這些錯誤報告和調試代碼會拖慢你的程序速度,而且將一些錯誤報告直接顯示給用戶,也具有相當的安全風險。因此,在生產環境請關閉它們。
8. 關閉數據庫連接當使用完畢后,注銷變量和關閉數據庫連接,可以釋放珍貴的內存資源。
9. 使用聚合函數減少數據庫查詢查詢數據庫時,使用聚合函數,可以減少檢索數據庫的頻率,并且使程序運行的更快。
10. 使用強大的字符串操作函數舉個例子,str_replace()比preg_replace()要快,而strtr()函數則比str_replace()函數快四倍。
11. 盡量使用單引號如果可能,盡量使用單引號替代雙引號。程序運行時,會檢查雙引號中的變量,這會拖慢程序的性能。
12. 嘗試使用恒等運算符由于“===”僅檢查閉合范圍,因此比使用“==”進行比較速度更快。
PHP代碼之外的性能瓶頸因素優化代碼當然能夠提高PHP的性能。但是,還有一些代碼之外的因素也會成為PHP的性能瓶頸。這就是為什么程序員需要了解代碼部署的整個服務器環境,這有助于他們在編寫代碼時有一定的心理準備,并能夠在性能出現問題時,快速識別和定位性能瓶頸。以下是你遇到性能瓶頸時需要檢查的點。
1. 網絡帶寬如果網絡帶寬不夠,其傳輸的總數據量將會受到嚴重影響,使其成為最明顯的性能瓶頸。
2. CPU如果只是傳輸一些純靜態的HTML,則不需要消耗很多CPU資源,但是PHP畢竟創建的是動態的應用程序,根據應用的需要,你可能至少需要一臺具備多核處理器的服務器來提升PHP代碼的運行效率。
3. 共享內存缺少共享內存可能會影響進程間通信,從而影響程序性能。
4. 文件系統隨著時間推移,你的文件系統可能會出現大量磁盤碎片。如果內存足夠,利用內存作為文件緩存可以加快磁盤的訪問速度。
5. 進程管理檢查服務器的進程,確保里面沒有非必要的進程。移除哪些不需要的網絡協議、病毒掃描軟件、郵件服務以及硬件驅動。將PHP代碼運行在多線程模式,也能提高程序的響應時間。
6. 相關的其它服務如果你的應用程序還依賴于一些外部服務,那這些外部服務的性能瓶頸也有可能拖慢你的應用。雖然這種情況下你能做的事情不多,但你仍然可以通過你這一邊的操作來減輕外部服務性能瓶頸對你的影響,例如切換到備用服務上等。
更多PHP性能優化建議 1. 發揮OPCache的優勢由于默認情況下,PHP代碼在執行時都會重新編譯為可執行的中間代碼OPCode,因此可以及時看到修改的代碼所帶來的變化,而不必頻繁的重啟PHP服務。不幸的是,如果每次在你的網站上運行時,都重新編譯相同的代碼會嚴重影響服務器的性能,這就是為什么opcode緩存或OPCache 非常有用。
OPCache是一個將編譯好的代碼保存到內存中的擴展。因此,下一次代碼執行時,PHP將檢查時間戳和文件大小,以確定源文件是否已更改。如果沒有,則直接運行緩存的代碼。
下圖顯示了運行無緩存的PHP應用程序,OPcache和eAccelerator(另一個PHP緩存工具)三者的執行時間和內存使用情況的差異。
如上所述,性能問題并不總是由代碼引起的。大多數瓶頸都出現在應用程序必須訪問資源的時候。由于PHP應用程序的數據訪問層可能占用最高90%的執行時間,因此你應該采取的第一步是查看代碼中訪問數據庫的所有實例。
確保打開SQL的慢日志,以幫助你識別和處理慢SQL,然后評估這些查詢的執行效率。如果你發現查詢過多,或者在單次執行過程中發現相同的查詢被多次進行,你可以通過減少數據庫訪問時間進行調整,從而提高應用程序的性能。
3. 清理文件系統清理文件系統,并確保沒有使用文件系統來存儲Session。最重要的是,請注意file_exists(),filesize()或filetime()等觸發文件統計信息的代碼。將任何這些功能置于循環中可能會導致性能問題。
4. 監控外部API接口大部分對外部系統有依賴關系的應用都會調用遠程API。雖然這些遠程API接口你無法直接控制,但你仍可以采取一些措施來減輕源自遠程API的性能問題。例如,你可以緩存API輸出的數據,或者可以在后臺調用這些API。為API請求設置合理的超時時間,并且如果可能的話,隨時做好API沒有響應的情況下的顯示輸出。
5. 使用工具評估檢測你的PHP代碼使用OPcache和監控外部API接口應該足以使大多數應用程序運行順利;但是,如果你發現系統負載不斷增加,那么可能需要使用工具來對你的PHP代碼進行檢測評估。完整的PHP代碼檢測評估雖然可能很耗時,但它可以為你提供有關應用程序性能的深入信息。幸運的是,有幾個開源程序可以用于分析你的PHP代碼,如Xdebug。
監控PHP性能的重要性如果你沒有做好準備,你的Web應用可能前一分鐘還在正常運行,但是下一分鐘,一波突然激增的流量就會導致你的應用程序崩潰。 當然,優化和重構總是需要時間、精力和資金,而且投入是否值得的也很難說。因此,做出明智決策的最佳方式是不斷收集數據。
PHP性能監控軟件可以幫助你立即測量所做的任何更改的影響。當然,知道要監測什么同樣重要。速度和內存使用被認為是性能的最佳指標,因為它們影響到頁面加載時間,這對Web應用程序至關重要。
雖然數據收集很重要,但是當你不需要監控系統時,你應該關閉監控系統,因為大量日志同樣也會對性能造成影響。當然,這樣的日志可以提供有關如何提高性能的有用信息,因此你應該在高峰期間定期監控。
未來的PHP性能PHP仍在不斷進化中,在目前正在開發的PHP 8版本中,最新的功能是即時編譯或JIT,它將可以為我們創建更快的Web應用。隨著技術的不斷進步,用戶的期望也隨之增加。因此,開發人員必須始終關注未來的變化。
在構建Web應用程序時,請記住,今年的工作可能在明年不起作用。你可能需要進行調整才能持續保持優秀的PHP性能。在開發過程中,應該持續重點關注如何構建適用于高并發場景的Web應用和網站,保證它們的高可用性。
參考文章Using a PHP CDN Setup
How to Install Nginx PHP
掃描下方二維碼或者微信搜索[phpjiagoushier],關注我的微信公眾號[PHP架構],參與互動交流。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22943.html
平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 1. Javascript 前端生成好看的二維碼 十大經典排序算法(帶動圖演示) 為什么知乎前端圈普遍認為H5游戲和H5展示的JSer 個人整理和封裝的YU.js庫|中文詳細注釋|供新手學習使用 擴展JavaScript語法記錄 - 掉坑初期工具 漢字拼音轉換...
平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 1. Javascript 前端生成好看的二維碼 十大經典排序算法(帶動圖演示) 為什么知乎前端圈普遍認為H5游戲和H5展示的JSer 個人整理和封裝的YU.js庫|中文詳細注釋|供新手學習使用 擴展JavaScript語法記錄 - 掉坑初期工具 漢字拼音轉換...
平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 1. Javascript 前端生成好看的二維碼 十大經典排序算法(帶動圖演示) 為什么知乎前端圈普遍認為H5游戲和H5展示的JSer 個人整理和封裝的YU.js庫|中文詳細注釋|供新手學習使用 擴展JavaScript語法記錄 - 掉坑初期工具 漢字拼音轉換...
平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 1. Javascript 前端生成好看的二維碼 十大經典排序算法(帶動圖演示) 為什么知乎前端圈普遍認為H5游戲和H5展示的JSer 個人整理和封裝的YU.js庫|中文詳細注釋|供新手學習使用 擴展JavaScript語法記錄 - 掉坑初期工具 漢字拼音轉換...
閱讀 3432·2021-11-22 09:34
閱讀 1899·2019-08-30 12:53
閱讀 3489·2019-08-28 18:07
閱讀 2975·2019-08-27 10:55
閱讀 2958·2019-08-26 10:12
閱讀 3584·2019-08-23 18:21
閱讀 1338·2019-08-23 14:10
閱讀 1468·2019-08-23 13:04