掃描二維碼關注

首頁 APP開(kāi)發小(xiǎo)程序開(kāi)發 微信公衆号 網站建設 營銷推廣 經典案列 産品服務 關于我們

“學習(xí)不僅是掌握知識”

向書(shū)本學習(xí),還要向實踐學習(xí)、向生活學習(xí)。消化已有(yǒu)知識,
而且要力求有(yǒu)所發現、有(yǒu)所發明(míng)、有(yǒu)所創造

PHP開(kāi)發程序應該注意的(de)42個(gè)優化準則

2019/4/6 10:38:24

PHP開(kāi)發程序應該注意的(de)42個(gè)優化準則

PHP 獨特的(de)語法混合了 C、Java、Perl 以及 PHP 自創新的(de)語法。它可(kě)以比 CGI或者Perl更快速的(de)執行(xíng)動态網頁。用(yòng)PHP做出的(de)動态頁面與其他(tā)的(de)編程語言相(xiàng)比,PHP是将程序嵌入到(dào)HTML文(wén)檔中去執行(xíng),執行(xíng)效率比完全生成 HTML标記的(de)CGI要高(gāo)許多。下面介紹了42個(gè)程序的(de)優化準則。

1.如(rú)果一個(gè)方法可(kě)靜态化,就對它做靜态聲明(míng)。速率可(kě)提升至4倍。

2.echo 比 print 快。

3.使用(yòng)echo的(de)多重參數(譯注:指用(yòng)逗号而不是句點)代替字符串連接。

4.在執行(xíng)for循環之前确定最大(dà)循環數,不要每循環一次都(dōu)計(jì)算最大(dà)值。

5.注銷那些不用(yòng)的(de)變量尤其是大(dà)數組,以便釋放(fàng)内存。

6.盡量避免使用(yòng)__get,__set,__autoload。

7.require_once()代價昂貴。

8.在包含文(wén)件(jiàn)時使用(yòng)完整路(lù)徑,解析操作系統路(lù)徑所需的(de)時間會(huì)更少(shǎo)。

9.如(rú)果你(nǐ)想知道腳本開(kāi)始執行(xíng)(譯注:即服務器(qì)端收到(dào)客戶端請求)的(de)時刻,使用(yòng)$_SERVER[‘REQUEST_TIME’]要好于time()。

10.函數代替正則表達式完成相(xiàng)同功能(néng)。

11.str_replace函數比preg_replace函數快,但(dàn)strtr函數的(de)效率是str_replace函數的(de)四倍。

12.如(rú)果一個(gè)字符串替換函數,可(kě)接受數組或字符作爲參數,并且參數長度不太長,那麽可(kě)以考慮額外寫一段替換代碼,使得每次傳遞參數是一個(gè)字符,而不是隻寫一行(xíng)代碼接受數組作爲查詢和(hé)替換的(de)參數。

13.使用(yòng)選擇分(fēn)支語句(譯注:即switch case)好于使用(yòng)多個(gè)if,else if語句。

14.用(yòng)@屏蔽錯誤消息的(de)做法非常低效。

15.打開(kāi)apache的(de)mod_deflate模塊。

16.數據庫連接當使用(yòng)完畢時應關掉。

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

18.錯誤消息代價昂貴。

19.盡量不要在for循環中使用(yòng)函數,比如(rú)for ($x=0; $x prop++)要比遞增一個(gè)局部變量慢(màn)3倍。

23.遞增一個(gè)未預定義的(de)局部變量要比遞增一個(gè)預定義的(de)局部變量慢(màn)9至10倍。

24.僅定義一個(gè)局部變量而沒在函數中調用(yòng)它,同樣會(huì)減慢(màn)速度(其程度相(xiàng)當于遞增一個(gè)局部變量)。PHP大(dà)概會(huì)檢查看是否存在全局變量。

25.方法調用(yòng)看來與類中定義的(de)方法的(de)數量無關,因爲我(在測試方法之前和(hé)之後都(dōu))添加了10個(gè)方法,但(dàn)性能(néng)上(shàng)沒有(yǒu)變化。

26.派生類中的(de)方法運行(xíng)起來要快于在基類中定義的(de)同樣的(de)方法。

27.調用(yòng)帶有(yǒu)一個(gè)參數的(de)空函數,其花費的(de)時間相(xiàng)當于執行(xíng)7至8次的(de)局部變量遞增操作。類似的(de)方法調用(yòng)所花費的(de)時間接近于15次的(de)局部變量遞增操作。

28.用(yòng)單引号代替雙引号來包含字符串,這樣做會(huì)更快一些。因爲PHP會(huì)在雙引号包圍的(de)字符串中搜尋變量,單引号則不會(huì)。當然,隻有(yǒu)當你(nǐ)不需要在字符串中包含變量時才可(kě)以這麽做。

29.輸出多個(gè)字符串時,用(yòng)逗号代替句點來分(fēn)隔字符串,速度更快。注意:隻有(yǒu)echo能(néng)這麽做,它是一種可(kě)以把多個(gè)字符串當作參數的(de)“函數”(譯注:PHP手冊中說echo是語言結構,不是真正的(de)函數,故把函數加上(shàng)了雙引号)。

30.Apache解析一個(gè)PHP腳本的(de)時間要比解析一個(gè)靜态HTML頁面慢(màn)2至10倍。盡量多用(yòng)靜态HTML頁面,少(shǎo)用(yòng)腳本。

31.除非腳本可(kě)以緩存,否則每次調用(yòng)時都(dōu)會(huì)重新編譯一次。引入一套PHP緩存機制(zhì)通常可(kě)以提升25%至100%的(de)性能(néng),以免除編譯開(kāi)銷。

32.盡量做緩存,可(kě)使用(yòng)memcached。memcached是一款高(gāo)性能(néng)的(de)内存對象緩存系統,可(kě)用(yòng)來加速動态Web應用(yòng)程序,減輕數據庫負載。對運算碼 (OP code)的(de)緩存很有(yǒu)用(yòng),使得腳本不必爲每個(gè)請求做重新編譯。

33.當操作字符串并需要檢驗其長度是否滿足某種要求時,你(nǐ)想當然地(dì)會(huì)使用(yòng)strlen()函數。此函數執行(xíng)起來相(xiàng)當快,因爲它不做任何計(jì)算,隻返回在zval 結構(C的(de)内置數據結構,用(yòng)于存儲PHP變量)中存儲的(de)已知字符串長度。

但(dàn)是,由于strlen()是函數,多多少(shǎo)少(shǎo)會(huì)有(yǒu)些慢(màn),因爲函數調用(yòng)會(huì)經過諸多步驟,如(rú)字母小(xiǎo)寫化(譯注:指函數名小(xiǎo)寫化,PHP不區分(fēn)函數名大(dà)小(xiǎo)寫)、哈希查找,會(huì)跟随被調用(yòng)的(de)函數一起執行(xíng)。在某些情況下,你(nǐ)可(kě)以使用(yòng)isset() 技巧加速執行(xíng)你(nǐ)的(de)代碼。

調用(yòng)isset()恰巧比strlen()快,因爲與後者不同的(de)是,isset()作爲一種語言結構,意味著(zhe)它的(de)執行(xíng)不需要函數查找和(hé)字母小(xiǎo)寫化。也(yě)就是說,實際上(shàng)在檢驗字符串長度的(de)頂層代碼中你(nǐ)沒有(yǒu)花太多開(kāi)銷。

34.當執行(xíng)變量$i的(de)遞增或遞減時,$i++會(huì)比++$i慢(màn)一些。這種差異是PHP特有(yǒu)的(de),并不适用(yòng)于其他(tā)語言,所以請不要修改你(nǐ)的(de)C或Java 代碼并指望它們能(néng)立即變快,沒用(yòng)的(de)。++$i更快是因爲它隻需要3條指令(opcodes),$i++則需要4條指令。後置遞增實際上(shàng)會(huì)産生一個(gè)臨時變 量,這個(gè)臨時變量随後被遞增。而前置遞增直接在原值上(shàng)遞增。這是最優化處理(lǐ)的(de)一種,正如(rú)Zend的(de)PHP優化器(qì)所作的(de)那樣。

牢記這個(gè)優化處理(lǐ)不失爲一個(gè)好主意,因爲并不是所有(yǒu)的(de)指令優化器(qì)都(dōu)會(huì)做同樣的(de)優化處理(lǐ),并且存在大(dà)量沒有(yǒu)裝配指令優化器(qì)的(de)互聯網服務提供商(ISPs)和(hé)服務器(qì)。

35.并不是事必面向對象(OOP),面向對象往往開(kāi)銷很大(dà),每個(gè)方法和(hé)對象調用(yòng)都(dōu)會(huì)消耗很多内存。

36.并非要用(yòng)類實現所有(yǒu)的(de)數據結構,數組也(yě)很有(yǒu)用(yòng)。

37.不要把方法細分(fēn)得過多,仔細想想你(nǐ)真正打算重用(yòng)的(de)是哪些代碼?

38.當你(nǐ)需要時,你(nǐ)總能(néng)把代碼分(fēn)解成方法。

39.盡量采用(yòng)大(dà)量的(de)PHP内置函數。

40.如(rú)果在代碼中存在大(dà)量耗時的(de)函數,你(nǐ)可(kě)以考慮用(yòng)C擴展的(de)方式實現它們。

41.評估檢驗(profile)你(nǐ)的(de)代碼。檢驗器(qì)會(huì)告訴你(nǐ),代碼的(de)哪些部分(fēn)消耗了多少(shǎo)時間。Xdebug調試器(qì)包含了檢驗程序,評估檢驗總體上(shàng)可(kě)以顯示出代碼的(de)瓶頸。

42.mod_zip可(kě)作爲Apache模塊,用(yòng)來即時壓縮你(nǐ)的(de)數據,并可(kě)讓數據傳輸量降低80%。

希望對你(nǐ)有(yǒu)幫助!

 


深圳市南山區南山街(jiē)道南海(hǎi)大(dà)道西(xī)桂廟路(lù)北陽光(guāng)華藝大(dà)廈1棟4F、4G-04

咨詢電話(huà):136 8237 6272
大(dà)客戶咨詢:139 0290 5075
業(yè)務QQ:195006118
技術(shù)QQ:179981967

更多可(kě)以了解的(de)信息

客戶案列
新聞資訊
資質榮譽
團隊風采
項目進度查詢

售前QQ咨詢
QQ溝通 項目QQ溝通

精銳軟件(jiàn)

Copyright© 2018-2023 深圳市無窮大軟件技術有限公司 All Rights Reserved. 京ICP證000000号 公安備案号:粵公網安備44030502009460号