天天看點

PHP代碼優化

1. 不要随便就複制變量

有時候為了使php 代碼更加整潔,一些php

新手(包括我)會把預定義好的變量複制到一個名字更簡短的變量中,其實這樣做的結果是增加了一倍的記憶體消耗,隻會使程式更加慢。試想一下,在下面的例子

中,如果使用者惡意插入512kb 位元組的文字到文本輸入框中,這樣就會導緻1mb 的記憶體被消耗!

bad:

$description = $_post[‘description‘]; echo $description;

good:

echo $_post[‘description‘];

2. 對字元串使用單引号

php 引擎允許使用單引号和雙引号來封裝字元串變量,但是這個是有很大的差别的!使用雙引号的字元串告訴php

引擎首先去讀取字元串内容,查找其中的變量,并改為變量對應的值。一般來說字元串是沒有變量的,是以使用雙引号會導緻性能不佳。最好是使用字元串連接配接而不

是雙引号字元串。

$output = "this is a plain string";

$output = ‘this is a plain string‘;

$type = "mixed"; $output = "this is a $type string";

$type = ‘mixed‘; $output = ‘this is a ‘ . $type .‘ string‘;

3. 使用echo 函數來輸出字元串

使用echo() 函數來列印結果出了有更容易之外,在下個例子中,你還可以看到有更好的性能。

print($myvariable);

echo $myvariable;

4. 不要在echo 中使用連接配接符

很多 程式員(有包括我)不知道在用 惡臭

輸出多個變量的時候,其實可以使用逗号來分開的,而不必用字元串先把他們先連起來,如下面的第一個例子中,由于使用了連接配接符就會有性能問題,因為這樣就會 需要php

引擎首先把所有的變量連接配接起來,然後在輸出,而在第二個例子中,php 引擎就會按照循序輸出他們。

echo ‘hello, my name is‘ . $firstname . $lastname . ‘ and i live in ‘ .

$city;

echo ‘hello, my name is‘ , $firstname , $lastname , ‘ and i live in ‘ ,

5. 使用switch/case 代替if/else

對于隻有單個變量的判斷,使用switch/case 語句而不是if/else 語句,會有更好的性能,并且代碼更加容易閱讀和維護。

if($_post[‘action‘] == ‘add‘) { adduser(); } elseif ($_post[‘action‘] ==

‘delete‘) { deleteuser(); } elseif ($_post[‘action‘] == ‘edit‘) { edituser(); }

else { defaultaction(); }

switch($_post[‘action‘]) { case ‘add‘: adduser(); break; case ‘delete‘:

deleteuser(); break; case ‘edit‘: edituser(); break; default: defaultaction();

break; }

1.在可以用file_get_contents調換file、fopen、feof、fgets等系列辦法的景象下,盡量用

file_get_contents,因為他的效力高得多!然則要重視file_get_contents在打開一個url檔案時辰的php版本題目; 

2.盡量的少進行檔案操縱,固然php的檔案操縱效力也不低的; 

3.優化select

sql語句,在可能的景象下盡量少的進行insert、update操縱(在上,我被惡批過); 

4.盡可能的應用php内部函數(然則我卻為了找個php裡面不存在的函數,浪費了本可以寫出一個自定義函數的時候,經驗題目啊!); 

5.輪回内部不要聲明變量,尤其是大變量:對象(這如同不隻是php裡面要重視的題目吧?); 

6.多元數組盡量不要輪回嵌套指派; 

7.在可以用php内部字元串操縱函數的景象下,不要用正規表達式; 

8.foreach效力更高,盡量用foreach庖代while和for輪回; 

9.用單引号調換雙引号引用字元串; 

10.“用i+=1庖代i=i+1。合适c/c++的習慣,效力還高”; 

11.對global變量,應當用完就unset()掉 

12.在多重嵌套輪回中,如有可能,該當将最長的輪回放在内層,最短輪回放在外層,如許就可以削減cpu跨切輪回層的次數,進而優化法度機能。 

40個優化你的php代碼的小提示 

1.

若是一個辦法可靜态化,就對它做靜态聲明。速度可提拔至4倍。 

2. echo 比

print 快。 

3.

應用echo的多重參數(譯注:指用逗号而不是句點)庖代字元串連接配接。 

4.

在履行for輪回之前斷定最大輪回數,不要每輪回一次都策畫最大值。 

5.

刊出那些不消的變量尤其是大數組,以便開釋記憶體。 

6.

盡量避免應用__get,__set,__autoload。 

7.

require_once()價格昂貴。 

8.

在包含檔案時應用完全路徑,解析操縱體系路徑所需的時候會更少。 

9.

若是你想知道腳本開端履行(譯注:即辦事器端收到用戶端懇求)的時刻,應用¥_server[‘request_time""]要好于time()。 

10.

搜檢是否能用strncasecmp,strpbrk,stripos函數庖代正規表達式完成雷同功能。 

11.

str_replace函數比preg_replace函數快,但strtr函數的效力是str_replace函數的四倍。 

12.

若是一個字元串調換函數,可接管數組或字元作為參數,并且參數長度不太長,那麼可以推敲額外寫一段調換代碼,使得每次傳遞參數是一個字元,而不是隻寫一行代碼接管數組作為查詢和調換的參數。 

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

if語句。 

14. 用@樊籬錯誤消息的做法很是低效。 

15.

打開apache的mod_deflate子產品。 

16.

資料庫連接配接當應用完畢時應關掉。 

17.

¥row[‘id""]的效力是¥row[id]的7倍。 

18.

錯誤消息價格昂貴。 

19. 盡量不要在for輪回中應用函數,比如for (¥x=0;

¥x < count(¥array); ¥x)每輪回一次都邑調用count()函數。 

20.

在辦法中遞增局部變量,速度是最快的。幾乎與在函數中調用局部變量的速度相當。 

21.

遞增一個全局變量要比遞增一個局部變量慢2倍。 

22.

遞增一個對象屬性(如:¥this->prop++)要比遞增一個局部變量慢3倍。 

23. 遞增一個未預定義的局部變量要比遞增一個預定義的局部變量慢9至10倍。 

24.

僅定義一個局部變量而沒在函數中調用它,同樣會減慢速度(其程度相當于遞增一個局部變量)。php可能會搜檢看是否存在全局變量。 

25.

辦法調用看來與類中定義的辦法的數量無關,因為我(在測試辦法之前和之後都)添加了10個辦法,但機能上沒有變更。 

26.

派生類中的辦法運作起來要快于在基類中定義的同樣的辦法。 

27.

調用帶有一個參數的空函數,其花費的時候相當于履行7至8次的局部變量遞增操縱。類似的辦法調用所花費的時候接近于15次的局部變量遞增操縱。 

28.

用單引号庖代雙引号來包含字元串,如許做會更快一些。因為php會在雙引号包抄的字元串中搜尋變量,單引号則不會。當然,隻有當你不須要在字元串中包含變量時才可以這麼做。 

29.

輸出多個字元串時,用逗号庖代句點來分隔字元串,速度更快。重視:隻有echo能這麼做,它是一種可以把多個字元串算作參數的“函數”(譯注:php手冊中說echo是說話布局,不是真正的函數,故把函數加上了雙引号)。 

30.

apache解析一個php腳本的時候要比解析一個靜态html頁面慢2至10倍。盡量多用靜态html頁面,罕用腳本。

31.

除非腳本可以緩存,不然每次調用時都邑從頭編譯一次。引入一套php緩存機制凡是可以提拔25%至100%的機能,以免除編譯開銷。 

32.

盡量做緩存,可應用memcached。memcached是一款高機能的記憶體對象緩存體系,可用來加快動态web應用法度,減輕資料庫負載。對運算碼(op

code)的緩存很有效,使得腳本不必為每個懇求做從頭編譯。 

33.

當操縱字元串并須要查驗其長度是否滿足某種請求時,你想當然地會應用strlen()函數。此函數履行起來相當快,因為它不做任何策畫,隻傳回在zval

布局(c的内置資料布局,用于存儲php變量)中存儲的已知字元串長度。然則,因為strlen()是函數,多幾許少會有些慢,因為函數調用會經過諸多步

調,如字母小寫化(譯注:指函數名小寫化,php不區分函數名大小寫)、哈希查找,會跟從被調用的函數一路履行。在某些景象下,你可以應用isset()

技能加快履行你的代碼。 

ex.(舉例如下) 

if

(strlen(¥foo) < 5) { echo “foo is too short”; } 

vs.(與下面的技能做鬥勁) 

if (!isset(¥foo{5})) { echo “foo is too short”;

調用isset()剛巧比strlen()快,因為與後者不合的是,isset()作為一種說話布局,意味着它的履行不須要函數查找和字母小寫化。也就是說,實際上在查驗字元串長度的頂層代碼中你沒有花太多開銷。 

34.

當履行變量¥i的遞增或遞減時,¥i++會比++¥i慢一些。這種差别是php特有的,并不實用于其他說話,是以請不要批改你的c或java代碼并指望它

們能立即變快,沒用的。++¥i更快是因為它隻須要3條指令(opcodes),¥i++則須要4條指令。後置遞增實際上會産生一個姑且變量,這個姑且變

量随後被遞增。而前置遞增直接在原值上遞增。這是最優化處理懲罰的一種,正如zend的php優化器所作的那樣。緊記這個優化處理懲罰不失為一個好主意,

因為并不是所有的指令優化器都邑做同樣的優化處理懲罰,并且存在多量沒有裝配指令優化器的網際網路辦事供給商(isps)和辦事器。 

35.

并不是事必面向對象(oop),面向對象往往開銷很大,每個辦法和對象調用都邑消費很多記憶體。 

36. 并非要用類實作所有的資料布局,數組也很有效。 

37.

不要把辦法細分得過多,細心想想你真正籌算重用的是哪些代碼? 

38.

當你須要時,你總能把代碼分化成辦法。 

39.

盡量采取多量的php内置函數。 

40.

若是在代碼中存在多量耗時的函數,你可以推敲用c擴大的體式格式實作它們。 

41.

評估查驗(profile)你的代碼。查驗器會告訴你,代碼的哪些項目組消費了幾許時候。xdebug調試器包含了查驗法度,評估查驗總體上可以顯示出代碼的瓶頸。 

42.

mod_zip可作為apache子產品,用來即時緊縮你的資料,并可讓資料傳輸量降落80%。