優化php程式,試試這幾招。

咖啡色的羊駝發表於2016-03-20

這篇文章屬於總結性質的內容,放在部落格裡面也是給自己備忘的。

一、.效能優化三部曲:

Created with Raphaël 2.1.0開始效能分析效能優化效能評估?結束yesno

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;記憶體/硬碟;網路情況都影響到效能。

相關文章