PHP應用性能優化指南

PHP7
程序員都喜歡最新的PHP 7,由於它使PHP成爲執行最快的腳本語言之一(參考PHP 7 vs HHVM 比較)。可是保持最佳性能不只須要快速執行代碼,更須要咱們知道影響性能的問題點,以及這些問題的解決方案。本文涵蓋了保障PHP應用平穩高速運行的全部知識點,大量乾貨來襲,強烈建議收藏。php

PHP簡史

PHP是由拉斯姆斯·勒多夫於1995年開始開發的。起初,它只是勒多夫爲了要維護我的網頁,而用c語言開發的一些CGI工具程序集,咱們從PHP這個縮寫最初的來源「Personal Home Page」(我的主頁)就能夠看出這一點。然而,隨着勒多夫不斷地擴充它的功能,PHP逐漸成爲了如今的「PHP:超文本預處理器」。nginx

在過去的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的研究,下圖展現了速度與可擴展性之間理論上的權衡關係。數據庫

Performance

紅線表示針對速度進行了優化的腳本,藍線是可擴展性優先的腳本。當併發鏈接數低時,紅線運行速度更快; 然而,隨着併發鏈接數量的增長,紅線變慢。當併發鏈接數上升時,藍線也減慢;然而,降低並不那麼劇烈,所以,在必定閾值後,速度優先的腳本會比可擴展性優先的腳本慢。然而,在現實當中,一些腳本可能隨着運行環境的變化而表現出先後不一樣的性能差別。你須要仔細的觀察用戶的使用狀況,以及應用的併發請求數量,來適時調整合適的優化策略。json

PHP代碼優化最佳實踐

編寫好的PHP代碼是建立快速穩定Web應用的關鍵一步。從一開始就遵循一些最佳實踐技巧將節省後期填坑的時間。緩存

1. 儘量的使用PHP的內置方法

只要能夠儘量的使用PHP的內置方法,而不是本身編寫相同功能的方法。花點時間去熟悉和學習PHP的內置方法,不但能夠幫助你更快的編寫代碼,並且可使你編寫的代碼更高效的運行。安全

2. 使用Json替代xml

json_encode()json_decode() 等PHP的內置方法,運行速度都很是快,全部應該優先使用Json。若是你沒法避免使用xml,那麼請務必使用正則表達式而不是DOM操做來進行解析。性能優化

3. 使用緩存技術

Memcache特別適用於減小數據庫負載,而像APCOPcache這樣的字節碼緩存引擎在腳本編譯時可節省執行時間。服務器

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緩存工具)三者的執行時間和內存使用狀況的差別。

Prestashop

圖片來源: Prestashop

2. 識別數據庫響應延遲

如上所述,性能問題並不老是由代碼引發的。大多數瓶頸都出如今應用程序必須訪問資源的時候。因爲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架構],參與互動交流。

phpjiagoushier

相關文章
相關標籤/搜索