首頁技術(shù)文章正文

PHP培訓(xùn)性能全面優(yōu)化的幾種方法(上)

更新時(shí)間:2017-05-31 來源:黑馬程序員PHP培訓(xùn)學(xué)院 瀏覽量:

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

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


一、變量(重要)      


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


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


       1)、 盡量減少循環(huán)的次數(shù)。
       2)、 盡量減少循環(huán)的潛逃的層次,不要超過三層。
       3)、 避免在循環(huán)內(nèi)有過多的業(yè)務(wù)邏輯。
       4)、 不要循環(huán)包含文件
       5)、 不要循環(huán)執(zhí)行數(shù)據(jù)庫操作。
       6)、 優(yōu)先使用foreach,它比for/while效率高
       7)、 不要把 count/strlen/sizeof 放到 for 循環(huán)的條件語句中 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ù)只干一件事,不要雜揉過多的業(yè)務(wù)邏輯
      2)、 函數(shù)代碼體不要超過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ù)不要超過 2000 行
       4)、Require_once/include_once 效率低于 require/include, 需要額外的去查看系統(tǒng)是否已經(jīng)調(diào)用過這個(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)、類庫文件加載,是否考慮類是否已經(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í)解析,沒有額外開銷 雜湊表更小,所以內(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]




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