教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

PHP性能如何實(shí)現(xiàn)全面優(yōu)化?

更新時(shí)間:2016年09月14日17時(shí)39分 來(lái)源:傳智播客PHP培訓(xùn)學(xué)院 瀏覽次數(shù):

性能是網(wǎng)站運(yùn)行是否良好的關(guān)鍵因素, 網(wǎng)站的性能與效率影響著公司的運(yùn)營(yíng)成本及長(zhǎng)遠(yuǎn)發(fā)展,編寫出高質(zhì)高效的代碼是我們每個(gè)開發(fā)人員必備的素質(zhì),也是我們良好的職業(yè)素養(yǎng)。

      如何優(yōu)化PHP性能呢?


一、變量(重要)      


       1)、 變量大小,注意變量大小是節(jié)約內(nèi)存的最有效手段,對(duì)于來(lái)自用戶表單、數(shù)據(jù)庫(kù)和文件緩存的數(shù)據(jù)都需要控制變量的大小。 因?yàn)閏pu要處理的數(shù)據(jù)是來(lái)源于內(nèi)存
       2)、 變量有效期,使用unset()函數(shù)注銷不需要的變量是一種良好的習(xí)慣,將一些不需要的變量立即注銷可提高內(nèi)存的使用率。
       3)、 復(fù)制變量,盡量不要復(fù)制變量,否則就會(huì)帶來(lái)1倍的內(nèi)存消耗,即使復(fù)制變量也應(yīng)該要立即注銷原有變量。
       4)、 變量類型,初始化變量請(qǐng)注意其變量類型,一個(gè)變量在執(zhí)行過(guò)程中最好只有一種類型狀態(tài)。對(duì)于數(shù)組變量,請(qǐng)初始化聲明,如下: $a = array();
       5)、 臨時(shí)變量,是處理業(yè)務(wù)邏輯的臨時(shí)存儲(chǔ),這些都是需要消耗內(nèi)存的。如果臨時(shí)變量使用結(jié)束請(qǐng)立即注銷,特別是在一些過(guò)程式代碼的執(zhí)行流程中,對(duì)于一些函數(shù),如果業(yè)務(wù)非常復(fù)雜,同樣需要立即注銷臨時(shí)變量
       6)、 靜態(tài)變量,對(duì)于一些需要由復(fù)雜業(yè)務(wù)產(chǎn)生的變量,如果在程序的執(zhí)行過(guò)程中多次產(chǎn)生并使用,可考慮使用靜態(tài)變量,減少程序的cpu執(zhí)行次數(shù)
       7)、 變量的性能:局部變量>全局變量>類屬性>未定義的變量。


二、循環(huán)(重要)


       1)、 盡量減少循環(huán)的次數(shù)。
       2)、 盡量減少循環(huán)的潛逃的層次,不要超過(guò)三層。
       3)、 避免在循環(huán)內(nèi)有過(guò)多的業(yè)務(wù)邏輯。
       4)、 不要循環(huán)包含文件
       5)、 不要循環(huán)執(zhí)行數(shù)據(jù)庫(kù)操作。
       6)、 優(yōu)先使用foreach,它比f(wàn)or/while效率高
       7)、 不要把 count/strlen/sizeof 放到 for 循環(huán)的條件語(yǔ)句中 For($i=0,$count=count($array);$i<$count;$i++){} 不要使用for($i=0;$i<count($array);$i++){};
       8)、 for($i=$total;$i>0;$i–){}性能好于for($i=0;$i<$total;$–){}
       9)、 保持循環(huán)體內(nèi)的業(yè)務(wù)邏輯清晰


三、 函數(shù)(重要)

   
1)、 函數(shù)職責(zé)清晰,一個(gè)函數(shù)只干一件事,不要雜揉過(guò)多的業(yè)務(wù)邏輯
      2)、 函數(shù)代碼體不要超過(guò)20行,反之,考慮拆分。
      3)、 優(yōu)先使用php內(nèi)置函數(shù)
      4)、 常量與函數(shù)同時(shí)能干一件事,優(yōu)先使用常量。
               例如:
                  · phpversion() < PHP_VERSION
                  · get_class() < __CLASS__
                  · is_null() < NULL ===
      5)、 echo 的性能好于print,輸入多個(gè)變量的時(shí)候用echo $str,$str1,不用.連接符
      6)、 $_SERVER[REQUEST_TIME]替換time();
      7)、 字符串替換strtr()->str_replace()->preg_replace()->epreg();
      8)、 發(fā)揮trim最大功效,替換substr。$filepath=trim($filename,’/’).’/’;
      9)、Isset/empty 雖然兩個(gè)函數(shù)功能有所差異,但在同樣的情況下推薦使用 empty()
    10)、isfile/file_exist 兩個(gè)函數(shù)的功能有所不同,file_exist既可判斷文件是否存在,也可以判斷目錄是否存在,在同樣的情況下推薦使用is_file



四、文件(重要)

1)、 減少文件包含數(shù),減少磁盤 IO
       2)、 使用完整路徑,或者容易轉(zhuǎn)換的相對(duì)路徑。避免在 include_path 查找
       3)、 文件的代碼行數(shù)不要超過(guò) 2000 行
       4)、Require_once/include_once 效率低于 require/include, 需要額外的去查看系統(tǒng)是否已經(jīng)調(diào)用過(guò)這個(gè)文件. 因?yàn)樗鼈冊(cè)谝粋€(gè) opcode 緩存下的調(diào)用非常慢
       5)、程序執(zhí)行文件用 requie/require_once,緩存文件用include/include_once。Include 效率好于 require
       6)、優(yōu)化 spl 中的文件自動(dòng)加載機(jī)制,可參靠 yii
       7)、類庫(kù)文件加載,是否考慮類是否已經(jīng)實(shí)例化,可考慮采用設(shè)計(jì)模式之單例模式
       8)、文件讀寫的并發(fā)性



五、面向?qū)ο?/strong>(重要)

1)、 控制實(shí)例的創(chuàng)建的數(shù)量
       2)、 優(yōu)先使用常量、類常量
       3)、 優(yōu)先例用靜態(tài)變量,靜態(tài)屬性
       4)、 類的結(jié)構(gòu)合理
       5)、 面象接口編程
       6)、 封裝變化點(diǎn)
       7)、 依賴于抽象,不依賴于細(xì)節(jié)
       8)、 優(yōu)先使用靜態(tài)成員
       9)、 類的接口清晰穩(wěn)定,類的職責(zé)單一,類與類的通信合理
     10)、 使用常量的好處 編譯時(shí)解析,沒(méi)有額外開銷 雜湊表更小,所以內(nèi)部查找更快 類常量?jī)H存在于特定「命名空間」,所以雜湊名更短 代碼更干凈,使除錯(cuò)更方便



六、字符串


        1)、 用單引號(hào)替代雙引號(hào)引用字符串;避免檢索字符串中的變量


七、運(yùn)算


       1)、 用 i+=1 代替i=i+1。符合c/c++的習(xí)慣,效率還高
       2)、 ++$i 的效率高于++$i,–$i 同理[/hide]


八、數(shù)組


      1)、 多維數(shù)組盡量不要循環(huán)嵌套賦值;
      2)、 使用$array[‘name’]方式訪問(wèn)數(shù)組,禁止$array[name]/$array[“name”]


九、判斷(重要)


1)、 邏輯判斷請(qǐng)優(yōu)先使用switch 的方式,對(duì)于業(yè)務(wù)邏輯相對(duì)較多的情況請(qǐng)選擇if/else,提高代碼的可讀性
     2)、 盡量控制if/else判斷的個(gè)數(shù),如果太多請(qǐng)考慮功能優(yōu)化或代碼優(yōu)化
     3)、 盡量使用恒等用于比較判斷,恒等的效率高于等于,而且還能避免一些類型強(qiáng)制轉(zhuǎn)換的錯(cuò)誤
     4)、 if/else與_&&,單條語(yǔ)句判斷請(qǐng)選擇&&的形式, &&的效率高于if/else,如下 :
                if ($a == 1) {
                    $b = 2;
                 }
               可選擇為($a == 1) && $b = 2;



十、緩存


      1)、 使用php加速器,緩沖opcode
      2)、 例用memcache/nosql
      3)、 使用內(nèi)存數(shù)據(jù)庫(kù)、
      4)、 使用文件緩存
      5)、 緩沖功能


十一、其它


     1)、 少用@符號(hào),嚴(yán)重影響性能
     2)、 適時(shí)關(guān)閉遠(yuǎn)程資源連接如數(shù)據(jù)庫(kù),ftp、socket等,適時(shí)的清理這些資源


十二、 數(shù)據(jù)庫(kù)優(yōu)化(重要)


1)、 合理的商業(yè)需情
     2)、 數(shù)據(jù)庫(kù) schema 架構(gòu)優(yōu)化
     3)、 垂直與水平分庫(kù)分表
     4)、 索引優(yōu)化,查詢優(yōu)化
     5)、 第三方開源檢索工具(sphinx)
     6)、 主從數(shù)據(jù)庫(kù)服務(wù)器的使用。
    



十三、 前端優(yōu)化


     1)、合理的 html 結(jié)構(gòu)
     2)、合理 html 與css 的同時(shí),考慮 Css 設(shè)計(jì)合理,減少 http 請(qǐng)求
     3)、合理 html 與java script 的同時(shí),考慮拆分是否合理,減少 http 請(qǐng)求
     4)、優(yōu)化 java script 代碼,讓用戶有良好的體驗(yàn)
     5)、根據(jù) http 協(xié)議,優(yōu)化高并發(fā)請(qǐng)求


十四、性能檢測(cè)工具(重要)

  

只要在百度上搜索“xxx如何檢網(wǎng)站性能”即可。
     1)、Web Server
     2)、ab
     3)、http_load
     4)、PHP
     5)、apd
     6)、xdebug
     7)、Mysql
     8)、explain
     9)、profiler




本文版權(quán)歸傳智播客PHP培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處,謝謝!
作者:傳智播客PHP培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/php/index.shtml
0 分享到:
和我們?cè)诰€交談!