歡迎進入含山縣吳楚新銳網絡科技有限公司官網!

服務熱線:0551-64935250

含山縣吳楚新銳網絡科技有限公司

PHP開發程序應該注意的(Of)42個(Indivual)優化準則

PHP 獨特的(Of)語法混合了(Got it) C、Java、Perl 以(By)及 PHP 自創新的(Of)語法。它可以(By)比 CGI或者Perl更快速的(Of)執行動态網頁。用(Use)PHP做出(Out)的(Of)動态頁面與其他(He)的(Of)編程語言相比,PHP是(Yes)将程序嵌入到HTML文檔中去執行,執行效率比完全生成HTML标記的(Of)CGI要(Want)高許多。下面介紹了(Got it)PHP開發程序應該注意的(Of)42個(Indivual)優化準則。

1.如果一(One)個(Indivual)方法可靜态化,就對它做靜态聲明。速率可提升至4倍。

2.echo 比 print 快。

3.使用(Use)echo的(Of)多重參數(譯注:指用(Use)逗号而不(No)是(Yes)句點)代替字符串連接。

4.在(Exist)執行for循環之前确定最大(Big)循環數,不(No)要(Want)每循環一(One)次都計算最大(Big)值。

5.注銷那些不(No)用(Use)的(Of)變量尤其是(Yes)大(Big)數組,以(By)便釋放内存。

6.盡量避免使用(Use)__get,__set,__autoload。

7.require_once()代價昂貴。

8.在(Exist)包含文件時(Hour)使用(Use)完整路徑,解析操作(Do)系統路徑所需的(Of)時(Hour)間會更少。

9.如果你想知道腳本開始執行(譯注:即服務器端收到客戶端請求)的(Of)時(Hour)刻,使用(Use)$_SERVER[‘REQUEST_TIME’]要(Want)好于(At)time()。

10.函數代替正則表達式完成相同功能。

11.str_replace函數比preg_replace函數快,但strtr函數的(Of)效率是(Yes)str_replace函數的(Of)四倍。

12.如果一(One)個(Indivual)字符串替換函數,可接受數組或字符作(Do)爲(For)參數,并且參數長度不(No)太長,那麽可以(By)考慮額外寫一(One)段替換代碼,使得每次傳遞參數是(Yes)一(One)個(Indivual)字符,而不(No)是(Yes)隻寫一(One)行代碼接受數組作(Do)爲(For)查詢和(And)替換的(Of)參數。

13.使用(Use)選擇分支語句(譯注:即switch case)好于(At)使用(Use)多個(Indivual)if,else if語句。

14.用(Use)@屏蔽錯誤消息的(Of)做法非常低效。

15.打開apache的(Of)mod_deflate模塊。

16.數據庫連接當使用(Use)完畢時(Hour)應關掉。

17.$row[‘id’]的(Of)效率是(Yes)$row[id]的(Of)7倍。

18.錯誤消息代價昂貴。

19.盡量不(No)要(Want)在(Exist)for循環中使用(Use)函數,比如for ($x=0; $x prop++)要(Want)比遞增一(One)個(Indivual)局部變量慢3倍。

23.遞增一(One)個(Indivual)未預定義的(Of)局部變量要(Want)比遞增一(One)個(Indivual)預定義的(Of)局部變量慢9至10倍。

24.僅定義一(One)個(Indivual)局部變量而沒在(Exist)函數中調用(Use)它,同樣會減慢速度(其程度相當于(At)遞增一(One)個(Indivual)局部變量)。PHP大(Big)概會檢查看是(Yes)否存在(Exist)全局變量。

25.方法調用(Use)看來與類中定義的(Of)方法的(Of)數量無關,因爲(For)我(在(Exist)測試方法之前和(And)之後都)添加了(Got it)10個(Indivual)方法,但性能上(Superior)沒有變化。

26.派生類中的(Of)方法運行起來要(Want)快于(At)在(Exist)基類中定義的(Of)同樣的(Of)方法。

27.調用(Use)帶有一(One)個(Indivual)參數的(Of)空函數,其花費的(Of)時(Hour)間相當于(At)執行7至8次的(Of)局部變量遞增操作(Do)。類似的(Of)方法調用(Use)所花費的(Of)時(Hour)間接近于(At)15次的(Of)局部變量遞增操作(Do)。

28.用(Use)單引号代替雙引号來包含字符串,這(This)樣做會更快一(One)些。因爲(For)PHP會在(Exist)雙引号包圍的(Of)字符串中搜尋變量,單引号則不(No)會。當然,隻有當你不(No)需要(Want)在(Exist)字符串中包含變量時(Hour)才可以(By)這(This)麽做。

29.輸出(Out)多個(Indivual)字符串時(Hour),用(Use)逗号代替句點來分隔字符串,速度更快。注意:隻有echo能這(This)麽做,它是(Yes)一(One)種可以(By)把多個(Indivual)字符串當作(Do)參數的(Of)“函數”(譯注:PHP手冊中說echo是(Yes)語言結構,不(No)是(Yes)真正的(Of)函數,故把函數加上(Superior)了(Got it)雙引号)。

30.Apache解析一(One)個(Indivual)PHP腳本的(Of)時(Hour)間要(Want)比解析一(One)個(Indivual)靜态HTML頁面慢2至10倍。盡量多用(Use)靜态HTML頁面,少用(Use)腳本。

31.除非腳本可以(By)緩存,否則每次調用(Use)時(Hour)都會重新編譯一(One)次。引入一(One)套PHP緩存機制通常可以(By)提升25%至100%的(Of)性能,以(By)免除編譯開銷。

32.盡量做緩存,可使用(Use)memcached。memcached是(Yes)一(One)款高性能的(Of)内存對象緩存系統,可用(Use)來加速動态Web應用(Use)程序,減輕數據庫負載。對運算碼 (OP code)的(Of)緩存很有用(Use),使得腳本不(No)必爲(For)每個(Indivual)請求做重新編譯。

33.當操作(Do)字符串并需要(Want)檢驗其長度是(Yes)否滿足某種要(Want)求時(Hour),你想當然地會使用(Use)strlen()函數。此函數執行起來相當快,因爲(For)它不(No)做任何計算,隻返回在(Exist)zval 結構(C的(Of)内置數據結構,用(Use)于(At)存儲PHP變量)中存儲的(Of)已知字符串長度。

但是(Yes),由于(At)strlen()是(Yes)函數,多多少少會有些慢,因爲(For)函數調用(Use)會經過諸多步驟,如字母小寫化(譯注:指函數名小寫化,PHP不(No)區分函數名大(Big)小寫)、哈希查找,會跟随被調用(Use)的(Of)函數一(One)起執行。在(Exist)某些情況下,你可以(By)使用(Use)isset() 技巧加速執行你的(Of)代碼。

(舉例如下)

if (strlen($foo) < 5) { echo "Foo is too short"$$ }

(與下面的(Of)技巧做比較)

if (!isset($foo{5})) { echo "Foo is too short"$$ }

調用(Use)isset()恰巧比strlen()快,因爲(For)與後者不(No)同的(Of)是(Yes),isset()作(Do)爲(For)一(One)種語言結構,意味着它的(Of)執行不(No)需要(Want)函數查找和(And)字母小寫化。也就是(Yes)說,實際上(Superior)在(Exist)檢驗字符串長度的(Of)頂層代碼中你沒有花太多開銷。

34.當執行變量$i的(Of)遞增或遞減時(Hour),$i++會比++$i慢一(One)些。這(This)種差異是(Yes)PHP特有的(Of),并不(No)适用(Use)于(At)其他(He)語言,所以(By)請不(No)要(Want)修改你的(Of)C或Java代碼并指望它們能立即變快,沒用(Use)的(Of)。++$i更快是(Yes)因爲(For)它隻需要(Want)3條指令(opcodes),$i++則需要(Want)4條指令。後置遞增實際上(Superior)會産生一(One)個(Indivual)臨時(Hour)變量,這(This)個(Indivual)臨時(Hour)變量随後被遞增。而前置遞增直接在(Exist)原值上(Superior)遞增。這(This)是(Yes)最優化處理的(Of)一(One)種,正如Zend的(Of)PHP優化器所作(Do)的(Of)那樣。

牢記這(This)個(Indivual)優化處理不(No)失爲(For)一(One)個(Indivual)好主意,因爲(For)并不(No)是(Yes)所有的(Of)指令優化器都會做同樣的(Of)優化處理,并且存在(Exist)大(Big)量沒有裝配指令優化器的(Of)互聯網服務提供商(ISPs)和(And)服務器。

35.并不(No)是(Yes)事必面向對象(OOP),面向對象往往開銷很大(Big),每個(Indivual)方法和(And)對象調用(Use)都會消耗很多内存。

36.并非要(Want)用(Use)類實現所有的(Of)數據結構,數組也很有用(Use)。

37.不(No)要(Want)把方法細分得過多,仔細想想你真正打算重用(Use)的(Of)是(Yes)哪些代碼?

38.當你需要(Want)時(Hour),你總能把代碼分解成方法。

39.盡量采用(Use)大(Big)量的(Of)PHP内置函數。

40.如果在(Exist)代碼中存在(Exist)大(Big)量耗時(Hour)的(Of)函數,你可以(By)考慮用(Use)C擴展的(Of)方式實現它們。

41.評估檢驗(profile)你的(Of)代碼。檢驗器會告訴你,代碼的(Of)哪些部分消耗了(Got it)多少時(Hour)間。Xdebug調試器包含了(Got it)檢驗程序,評估檢驗總體上(Superior)可以(By)顯示出(Out)代碼的(Of)瓶頸。

42.mod_zip可作(Do)爲(For)Apache模塊,用(Use)來即時(Hour)壓縮你的(Of)數據,并可讓數據傳輸量降低80%。

在(Exist)線客服
服務熱線