PHP開發規範之效能最佳化分享

testingbang發表於2019-07-28

一、規範說明

效能是網站執行是否良好的關鍵因素,網站的效能與效率影響著公司的運營成本及長遠發展,編寫出高質高效的程式碼是我們每個開發人員必備的素質,也是我們良好的職業素養。

二、影響效能的因素

A、 商業需求

需求合理性
需求與系統的整合
需求所帶來的商業利益是否與需求開發的成本成正比
需求所帶來的風險
B、 Web 伺服器

併發處理能力
高負載的能力
負載均衡的能力
動態內容與靜態內容的處理能力
Web 伺服器部署
C、 DataBase 伺服器

併發訪問
資料庫伺服器的部署
資料庫的 shema 架構與的表設計是否合理
資料檢索
D、 作業系統

E、 客戶端請求
F、 程式/語言


三、分析效能的指標

程式的執行時間 2
程式的執行所消耗的記憶體
單位時間內的並行處理
磁碟 IO 的處理
四、最佳化效能的目標
快速、併發、資源消耗低(記憶體、磁碟 IO、CPU 負載)

五、最佳化效能的原則

伺服器配配置最最佳化
伺服器部署合理化
商業需求合理並與產出的商業價值成正比
架構可用、可維護、可擴充套件
程式的正確性、簡單性、邏輯的合理性。
不斷的分析效能的的瓶頸
不斷的重構已有的程式碼
最佳化的優先順序:program->database->web sersver->os->client
六、最佳化

A、 程式最佳化

變數
1、 變數大小,注意變數大小是節約記憶體的最有效手段,對於來自使用者表單、資料庫和檔案快取的資料都需要控制變數的大小。因為cpu要處理的資料是來源於記憶體

2、 變數有效期,使用unset()函式登出不需要的變數是一種良好的習慣,將一些不需要的變數立即登出可提高記憶體的使用率。

3、 複製變數,儘量不要複製變數,否則就會帶來1倍的記憶體消耗,即使複製變數也應該要立即登出原有變數。

4、 變數型別,初始化變數請注意其變數型別,一個變數在執行過程中最好只有一種型別狀態。對於陣列變數,請初始化宣告,如下: $a = array();

5、臨時變數,是處理業務邏輯的臨時儲存,這些都是需要消耗記憶體的。如果臨時變數使用結束請立即登出,特別是在一些過程式程式碼的執行流程中,對於一些函式,如果業務非常複雜,同樣需要立即登出臨時變數

6、靜態變數,對於一些需要由複雜業務產生的變數,如果在程式的執行過程中多次產生並使用,可考慮使用靜態變數,減少程式的cpu執行次數

7、變數的效能:區域性變數>全域性變數>類屬性>未定義的變數。

迴圈
1、 儘量減少迴圈的次數。
2、 儘量減少迴圈的潛逃的層次,不要超過三層。
3、 避免在迴圈內有過多的業務邏輯。
4、 不要迴圈包含檔案
5、 不要迴圈執行資料庫操作。
6、 優先使用foreach,它比for/while效率高
7、 不要把 count/strlen/sizeof 放到 for 迴圈的條件語句中 For($i=0,$count=count($array);$i<$count;$i++){} 不要使用for($i=0;$i<count($array);$i++){};

8、 for($i=$total;$i>0;$i&ndash;){}效能好於for($i=0;$i<$total;$&ndash;){}
9、 保持迴圈體內的業務邏輯清晰

函式
1、 函式職責清晰,一個函式只幹一件事,不要雜揉過多的業務邏輯
2、 函式程式碼體不要超過20行,反之,考慮拆分。
3、 優先使用php內建函式
4、 常量與函式同時能幹一件事,優先使用常量。

phpversion() < PHP_VERSION
get_class() < __CLASS__
is_null() < NULL ===
5、 echo 的效能好於print,輸入多個變數的時候用echo $str,$str1,不用.連線符
6、 $_SERVER[REQUEST_TIME]替換time();
7、字串替換strtr()->str_replace()->preg_replace()->epreg();
8、 發揮trim最大功效,替換substr。$filepath=trim($filename,&rsquo;/&rsquo;).&rsquo;/&rsquo;;
9、Isset/empty 雖然兩個函式功能有所差異,但在同樣的情況下推薦使用 empty()
10、isfile/file_exist 兩個函式的功能有所不同,file_exist既可判斷檔案是否存在,也可以判斷目錄是否存在,在同樣的情況下推薦使用is_file

檔案
1、 減少檔案包含數,減少磁碟 IO
2、 使用完整路徑,或者容易轉換的相對路徑。避免在 include_path 查詢
3、 檔案的程式碼行數不要超過 2000 行
4、Require_once/include_once 效率低於 require/include, 需要額外的去檢視系統是否已經呼叫過這個檔案. 因為它們在一個 opcode 快取下的呼叫非常慢

5、程式執行檔案用 requie/require_once,快取檔案用include/include_once。Include 效率好於 require
6、最佳化 spl 中的檔案自動載入機制,可參靠 yii

7、類庫檔案載入,是否考慮類是否已經例項化,可考慮採用設計模式之單例模式
8、檔案讀寫的併發性

物件導向
1、 控制例項的建立的數量
2、 優先使用常量、類常量
3、 優先例用靜態變數,靜態屬性
4、 類的結構合理
5、 面象介面程式設計
6、 封裝變化點
7、 依賴於抽象,不依賴於細節
8、 優先使用靜態成員
9、 類的介面清晰穩定,類的職責單一,類與類的通訊合理
10、 使用常量的好處 編譯時解析,沒有額外開銷 雜湊表更小,所以內部查詢更快 類常量僅存在於特定「名稱空間」,所以雜湊名更短程式碼更乾淨,使除錯更方便

字串
1、 用單引號替代雙引號引用字串;避免檢索字串中的變數

運算
1、 用 i+=1 代替i=i+1。符合c/c++的習慣,效率還高
2、 ++$i 的效率高於++$i,&ndash;$i 同理

陣列
1、 多維陣列儘量不要迴圈巢狀賦值;
2、 使用$array[&lsquo;name&rsquo;]方式訪問陣列,禁止$array[name]/$array[&ldquo;name&rdquo;]

判斷
1、 邏輯判斷請優先使用switch 的方式,對於業務邏輯相對較多的情況請選擇if/else,提高程式碼的可讀性
2、 儘量控制if/else判斷的個數,如果太多請考慮功能最佳化或程式碼最佳化
3、 儘量使用恆等用於比較判斷,恆等的效率高於等於,而且還能避免一些型別強制轉換的錯誤
4、 if/else與_&&,單條語句判斷請選擇&&的形式, &&的效率高於if/else,如下 :
if ($a == 1) {
$b = 2;
}可選擇為($a == 1) && $b = 2;

快取
1、 使用php加速器,緩衝opcode
2、 例用memcache/nosql
3、 使用記憶體資料庫、
4、 使用檔案快取
5、 緩衝功能 5

其它
1、 少用@符號,嚴重影響效能
2、 適時關閉遠端資源連線如資料庫,ftp、socket等,適時的清理這些資源

B、 資料庫最佳化
1、 合理的商業需情
2、 資料庫 schema 架構最佳化
3、 垂直與水平分庫分表
4、 索引最佳化,查詢最佳化
5、 第三方開源檢索工具(sphinx)
6、 主從資料庫伺服器的使用。
C、 Web 服器最佳化(暫未整理,有相應的 Web 伺服器最佳化手冊)

D、 作業系統最佳化(暫未整理,有相應的 OS 最佳化手冊)

E、 前端最佳化
1、合理的 html 結構
2、合理 html 與css 的同時,考慮 Css 設計合理,減少 http 請求
3、合理 html 與javascript 的同時,考慮拆分是否合理,減少 http 請求
4、最佳化 javascript 程式碼,讓使用者有良好的體驗
5、根據 http 協議,最佳化高併發請求

七、效能檢測工具

Web Server

 ab
 http_load
PHP

 apd
 xdebug
Mysql

 explain

profiler 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942496/viewspace-2652010/,如需轉載,請註明出處,否則將追究法律責任。

相關文章