優化php程式,試試這幾招。
這篇文章屬於總結性質的內容,放在部落格裡面也是給自己備忘的。
一、.效能優化三部曲:
1.效能的評估
1.1評估的指標
評估指標主要看兩個東西:QPS(有效能分析工具可直接檢視,沒有的話通過awk日誌檔案檢視)和相應時間(可埋點監測)
簡單解釋下為什麼是這兩個,一方面提高QPS可以從一定程度節省機器開銷進而省錢,另一方面減少響應時間可以提高使用者的體驗,人多了自然錢來的就快了。
1.2評估的方法
關於QPS的檢測,可使用壓力測試工具比如ab,wrk等,或者直接awk日誌分析出來;響應時間可通過專門的埋點檢測記下執行時間(gettimeofday/microtime)
如果評估的結果不是很穩定?1.先在測試前先不記錄,先發一些請求預熱一下(主要是為了快取,cdn等) 2.呼叫後端的mock資料(推薦facebook的FBMock),以排除不確定的因素。3.多次檢測取平均值算標準差。
2.效能的分析
2.1 QPS的瓶頸
QPS=min(min(client併發數,server併發數)*1s/平均響應時間,cpu核數*1s/單位請求cpu的時間)
所有優化方向主要是兩個:1.如果是響應時間的瓶頸則應提高併發數活著減少平均響應時間來提高qps 2.如果是cpu瓶頸,就要換更給力的cpu來減少cpu時間了。
2.2 耗時的分析
響應時間的構成=cpu時間+檔案的io時間+網路io時間+執行緒的同步sleep+其他會影響block執行緒的操作
2.3 效能分析工具
Xhprof:可通過觀察程式碼的流程以及主要耗時的點,對點優化
二、效能優化方法
有句話叫“架構決定了系統的上限,程式碼決定了系統的下限”。所有優化方向主要就是架構級的優化(數量級的提升)和程式碼級的優化(常數級的提升)
1.架構級的優化
1.1引擎的選擇
php5.x, php7(phpng), HHVM, HippyVM等等
1.2儲存選型/索引處理
關於儲存的型別主要分為mysql和nosql兩大塊:Mysql, Mongo, Redis...。需要根據具體的情況選擇不同的資料庫,比如對於地理位置的處理,mongodb就有專門的東西。索引方面簡單來說還是要結合實際場景應用的搜尋方式進行索引的新增,話題太長不做深入探討。
1.3加cache
分散式的快取:Memcached、Redis等(存在一致性hash、rehash、主從機制、分散式cas等等)
本地的快取:OpCache(推薦,php5.5+以及將其預設繫結了,但是需要開啟才能使用),APC(php5.5-推薦使用),Yac(鳥哥傑作,無加索的共享記憶體)等等
1.4並行化、非同步化
常用的事:PHP Pthread,swoole,Yar,mysqli_poll,佇列指令碼的使用等等
2.程式碼級的優化
2.1 減少重複的計算
主要體現在for;foreach的迴圈中,如果一開始就定住的值無需在迴圈中數次計算。
2.2 合理使用擴充套件
如果系統中經常使用某個耗時函式,則可將此函式寫成c擴充套件的形勢進行呼叫更給力;str系列的函式>正則>自己遍歷字串;array函式>自己遍歷陣列;isset>in_array()
2.3 後端呼叫優化
批量獲取>單個獲取;並行請求/處理>序列請求/處理;本地呼叫>http rpc
2.4 日誌以及異常處理
日誌使用非同步化記錄(register_shutdown_function);不要線上上列印DEBUG和TRACE級別的日誌;關閉E_NOTICE級別的日誌;消除正常情況下所有的PHP Warning/Exception;儘量不使用set_error_handler自定義錯誤處理;儘量不使用@來抑制錯誤
2.5 引擎指定優化(HHVM)
全域性程式碼包裝成一個函式再進行呼叫;避免使用太多的php動態特性(include, eval, compact, create_function, extract, get_defined_vars);用類代替關聯陣列
三、總述:效能的優化是全棧的
1.從產品功能的層面看,優化產品需求對於程式碼的發展以及後面的優化是有很大影響的。
2.從業務邏輯的層面看,優化sever端業務的冗餘邏輯,以及對業務進行恰當合適的封裝複用,減少複雜係數。
3.從開發技術的層面看,前端所使用的引擎以及框架;php的引擎、擴充套件以及版本(php7效能很給力);基礎服務的一些實現,這些都會影響到效能的優化。
4.從作業系統的層面看,資源的分配與排程,底層的驅動等等對於效能都會產生影響。
5.從底層硬體的層面看,cpu/gpu;記憶體/硬碟;網路情況都影響到效能。
相關文章
- 自媒體如何快速實現漲粉?試試這幾招!
- 程式設計沒靈感?快來試試這10招程式設計
- 如何提高自己自媒體平臺賬號的權重?快來試試這幾招!
- 試試這幾招 讓你的導購線上變身連線顧客的“超級個體”
- Python 程式碼寫得醜怎麼辦,試試這幾款神器Python
- 想要把程式碼片段轉成圖片?試試這幾款線上工具
- ClickHouse效能優化?試試物化檢視優化
- ClickHouse 效能優化?試試物化檢視優化
- PHP程式設計考試PHP程式設計
- 想寫出優雅的程式碼?試試這些ES6小tips
- 有效進行自動化測試,這幾個軟體測試工具一定要收藏好!!!
- 【程式設計測試題】頭條校招程式設計
- 華為秋招筆試題筆試
- MySQL優化篇(一),我可以和麵試官多聊幾句嗎?——SQL優化流程與優化資料庫物件MySql優化資料庫物件
- 小程式自動化測試--測試3
- 如何寫出優雅的程式碼?試試這些開源專案「GitHub 熱點速覽」Github
- 測試PHPPHP
- 單元測試效率優化:為什麼要對程式進行測試?測試有什麼好處?優化
- 測試平臺後端優化後端優化
- 前端效能優化之效能測試前端優化
- SQL優化思路&結果集重用優化、分割槽索引優化測試SQL優化索引
- [譯]來試試這個真正的 JavaScript 偵錯程式吧!JavaScript
- 引入測試報告與結構優化(二)測試套件測試報告優化套件
- UE 手遊在 iOS 平臺執行時記憶體佔用太高?試試這樣著手優化iOS記憶體優化
- 程式設計師校招筆試經驗小分享程式設計師筆試
- EMC校招筆試題目筆試
- [原創]ETL效能測試和優化優化
- SSD 下的 MySQL IO 優化嘗試MySql優化
- 無線效能優化:FPS測試優化
- 分享幾款一鍵搭建php本地測試環境工具PHP
- 敏捷測試VS傳統測試對比,6招玩轉敏捷測試!敏捷測試
- 測試你的前端程式碼:視覺化測試前端視覺化
- PHP面試試題PHP面試
- PHP 程式碼優化技巧總結PHP優化
- PHP程式碼優化技巧大盤點PHP優化
- 如何編寫優秀的測試程式碼|單元測試
- php優化PHP優化
- struts國際化程式嘗試