提高PHP編程效率的(de)50個(gè)方法
0、用單引号代替雙引号來(lái)包含字符串,這(zhè)樣做會更快一(yī / yì /yí)些。因爲(wéi / wèi) PHP 會在(zài)雙引号包圍的(de) 字符串中搜尋變量,單引号則不(bù)會,注意:隻有 echo 能這(zhè)麽做,它是(shì)一(yī / yì /yí)種可以(yǐ)把多個(gè)字符 串當作參數的(de)“函數”(譯注:PHP 手冊中說(shuō) echo 是(shì)語言結構,不(bù)是(shì)真正的(de)函數,故把函數 加上(shàng)了(le/liǎo)雙引号)。
1、如果能将類的(de)方法定義成 static,就(jiù)盡量定義成 static,它的(de)速度會提升将近 4 倍。
2、$row[’id’] 的(de)速度是(shì)$row[id]的(de) 7 倍。
3、echo 比 print 快,并且使用 echo 的(de)多重參數(譯注:指用逗号而(ér)不(bù)是(shì)句點)代替字符串 連接,比如 echo $str1,$str2。
4、在(zài)執行 for 循環之(zhī)前确定最大(dà)循環數,不(bù)要(yào / yāo)每循環一(yī / yì /yí)次都計算最大(dà)值,最好運用 foreach 代替。
5、注銷那些不(bù)用的(de)變量尤其是(shì)大(dà)數組,以(yǐ)便釋放内存。
6、盡量避免使用__get,__set,__autoload。
7、require_once()代價昂貴。
8、include 文件時(shí)盡量使用絕對路徑,因爲(wéi / wèi)它避免了(le/liǎo) PHP 去 include_path 裏查找文件的(de)速 度,解析操作系統路徑所需的(de)時(shí)間會更少。
9、如果你想知道(dào)腳本開始執行(譯注:即服務器端收到(dào)客戶端請求)的(de)時(shí)刻,使用 $_SERVER['REQUEST_TIME'] 要(yào / yāo)好于(yú) time()
10、函數代替正則表達式完成相同功能。
11、str_replace 函數比 preg_replace 函數快,但 strtr 函數的(de)效率是(shì) str_replace 函數的(de)四 倍。
12、如果一(yī / yì /yí)個(gè)字符串替換函數,可接受數組或字符作爲(wéi / wèi)參數,并且參數長度不(bù)太長,那麽 可以(yǐ)考慮額外寫一(yī / yì /yí)段替換代碼, 使得每次傳遞參數是(shì)一(yī / yì /yí)個(gè)字符, 而(ér)不(bù)是(shì)隻寫一(yī / yì /yí)行代碼接受數 組作爲(wéi / wèi)查詢和(hé / huò)替換的(de)參數。
13、使用選擇分支語句(譯注:即 switch case)好于(yú)使用多個(gè) if,else if 語句。
14、用@屏蔽錯誤消息的(de)做法非常低效,極其低效。
15、打開 apache 的(de) mod_deflate 模塊,可以(yǐ)提高網頁的(de)浏覽速度。
16、數據庫連接當使用完畢時(shí)應關掉,不(bù)要(yào / yāo)用長連接。
17、錯誤消息代價昂貴。
18、在(zài)方法中遞增局部變量,速度是(shì)最快的(de)。幾乎與在(zài)函數中調用局部變量的(de)速度相當。
19、遞增一(yī / yì /yí)個(gè)全局變量要(yào / yāo)比遞增一(yī / yì /yí)個(gè)局部變量慢 2 倍。
20、遞增一(yī / yì /yí)個(gè)對象屬性(如:$this->prop++)要(yào / yāo)比遞增一(yī / yì /yí)個(gè)局部變量慢 3 倍。
21、遞增一(yī / yì /yí)個(gè)未預定義的(de)局部變量要(yào / yāo)比遞增一(yī / yì /yí)個(gè)預定義的(de)局部變量慢 9 至 10 倍。
22、僅定義一(yī / yì /yí)個(gè)局部變量而(ér)沒在(zài)函數中調用它,同樣會減慢速度(其程度相當于(yú)遞增一(yī / yì /yí)個(gè)局 部變量)。PHP 大(dà)概會檢查看是(shì)否存在(zài)全局變量。
23、方法調用看來(lái)與類中定義的(de)方法的(de)數量無關,因爲(wéi / wèi)我(在(zài)測試方法之(zhī)前和(hé / huò)之(zhī)後都)添加了(le/liǎo) 10 個(gè)方法,但性能上(shàng)沒有變化。
24、派生類中的(de)方法運行起來(lái)要(yào / yāo)快于(yú)在(zài)基類中定義的(de)同樣的(de)方法。
25、調用帶有一(yī / yì /yí)個(gè)參數的(de)空函數,其花費的(de)時(shí)間相當于(yú)執行 7 至 8 次的(de)局部變量遞增操作。 類似的(de)方法調用所花費的(de)時(shí)間接近于(yú) 15 次的(de)局部變量遞增操作。
26、Apache 解析一(yī / yì /yí)個(gè) PHP 腳本的(de)時(shí)間要(yào / yāo)比解析一(yī / yì /yí)個(gè)靜态 HTML 頁面慢 2 至 10 倍。盡量 多用靜态 HTML 頁面,少用腳本。
27、除非腳本可以(yǐ)緩存,否則每次調用時(shí)都會重新編譯一(yī / yì /yí)次。引入一(yī / yì /yí)套 PHP 緩存機制通常 可以(yǐ)提升 25%至 100%的(de)性能,以(yǐ)免除編譯開銷。
28、盡量做緩存,可使用 memcached。memcached 是(shì)一(yī / yì /yí)款高性能的(de)内存對象緩存系統, 可用來(lái)加速動态 Web 應用程序,減輕數據庫負載。對運算碼 (OP code)的(de)緩存很有用,使 得腳本不(bù)必爲(wéi / wèi)每個(gè)請求做重新編譯。
29、 當操作字符串并需要(yào / yāo)檢驗其長度是(shì)否滿足某種要(yào / yāo)求時(shí), 你想當然地(dì / de)會使用 strlen()函數。 此函數執行起來(lái)相當快,因爲(wéi / wèi)它不(bù)做任何計算,隻返回在(zài) zval 結構(C 的(de)内置數據結構,用 于(yú)存儲 PHP 變量)中存儲的(de)已知字符串長度。但是(shì),由于(yú) strlen()是(shì)函數,多多少少會有些 慢,因爲(wéi / wèi)函數調用會經過諸多步驟,如字母小寫化(譯注:指函數名小寫化,PHP 不(bù)區分函 數名大(dà)小寫)、哈希查找,會跟随被調用的(de)函數一(yī / yì /yí)起執行。在(zài)某些情況下,你可以(yǐ)使用 isset() 技巧加速執行你的(de)代碼。 (舉例如下) if (strlen($foo) < 5) { echo “Foo is too short”$$ } (與下面的(de)技巧做比較) if (!isset($foo{5})) { echo “Foo is too short”$$ } 調用 isset()恰巧比 strlen()快,因爲(wéi / wèi)與後者不(bù)同的(de)是(shì),isset()作爲(wéi / wèi)一(yī / yì /yí)種語言結構,意味着它 的(de)執行不(bù)需要(yào / yāo)函數查找和(hé / huò)字母小寫化。 也(yě)就(jiù)是(shì)說(shuō), 實際上(shàng)在(zài)檢驗字符串長度的(de)頂層代碼中你 沒有花太多開銷。
30、當執行變量$i 的(de)遞增或遞減時(shí),$i++會比++$i 慢一(yī / yì /yí)些。這(zhè)種差異是(shì) PHP 特有的(de),并不(bù) 适用于(yú)其他(tā)語言, 所以(yǐ)請不(bù)要(yào / yāo)修改你的(de) C 或 Java 代碼并指望它們能立即變快, 沒用的(de)。 ++$i 更快是(shì)因爲(wéi / wèi)它隻需要(yào / yāo) 3 條指令(opcodes),$i++則需要(yào / yāo) 4 條指令。後置遞增實際上(shàng)會産生一(yī / yì /yí) 個(gè)臨時(shí)變量,這(zhè)個(gè)臨時(shí)變量随後被遞增。而(ér)前置遞增直接在(zài)原值上(shàng)遞增。這(zhè)是(shì)最優化處理的(de) 一(yī / yì /yí)種,正如 Zend 的(de) PHP 優化器所作的(de)那樣。牢記這(zhè)個(gè)優化處理不(bù)失爲(wéi / wèi)一(yī / yì /yí)個(gè)好主意,因爲(wéi / wèi) 并不(bù)是(shì)所有的(de)指令優化器都會做同樣的(de)優化處理, 并且存在(zài)大(dà)量沒有裝配指令優化器的(de)互聯 網服務提供商(ISPs)和(hé / huò)服務器。
31、并不(bù)是(shì)事必面向對象(OOP),面向對象往往開銷很大(dà),每個(gè)方法和(hé / huò)對象調用都會消耗很 多内存。
32、并非要(yào / yāo)用類實現所有的(de)數據結構,數組也(yě)很有用。
33、不(bù)要(yào / yāo)把方法細分得過多,仔細想想你真正打算重用的(de)是(shì)哪些代碼?
34、當你需要(yào / yāo)時(shí),你總能把代碼分解成方法。
35、盡量采用大(dà)量的(de) PHP 内置函數。
36、如果在(zài)代碼中存在(zài)大(dà)量耗時(shí)的(de)函數,你可以(yǐ)考慮用 C 擴展的(de)方式實現它們。
37、 評估檢驗(profile)你的(de)代碼。 檢驗器會告訴你, 代碼的(de)哪些部分消耗了(le/liǎo)多少時(shí)間。 Xdebug 調試器包含了(le/liǎo)檢驗程序,評估檢驗總體上(shàng)可以(yǐ)顯示出(chū)代碼的(de)瓶頸。
38、mod_zip 可作爲(wéi / wèi) Apache 模塊,用來(lái)即時(shí)壓縮你的(de)數據,并可讓數據傳輸量降低 80%。
39、在(zài)可以(yǐ)用 file_get_contents 替代 file、fopen、feof、fgets 等系列方法的(de)情況下,盡量 用 file_get_contents,因爲(wéi / wèi)他(tā)的(de)效率高得多!但是(shì)要(yào / yāo)注意 file_get_contents 在(zài)打開一(yī / yì /yí)個(gè) URL 文件時(shí)候的(de) PHP 版本問題;
40、盡量的(de)少進行文件操作,雖然 PHP 的(de)文件操作效率也(yě)不(bù)低的(de);
41、優化 Select SQL 語句,在(zài)可能的(de)情況下盡量少的(de)進行 Insert、Update 操作(在(zài) update 上(shàng),我被惡批過);
42、盡可能的(de)使用 PHP 内部函數(但是(shì)我卻爲(wéi / wèi)了(le/liǎo)找個(gè) PHP 裏面不(bù)存在(zài)的(de)函數,浪費了(le/liǎo)本可 以(yǐ)寫出(chū)一(yī / yì /yí)個(gè)自定義函數的(de)時(shí)間,經驗問題啊!);
43、 循環内部不(bù)要(yào / yāo)聲明變量, 尤其是(shì)大(dà)變量: 對象(這(zhè)好像不(bù)隻是(shì) PHP 裏面要(yào / yāo)注意的(de)問題吧?);
44、多維數組盡量不(bù)要(yào / yāo)循環嵌套賦值;
45、在(zài)可以(yǐ)用 PHP 内部字符串操作函數的(de)情況下,不(bù)要(yào / yāo)用正則表達式;
46、foreach 效率更高,盡量用 foreach 代替 while 和(hé / huò) for 循環;
47、用單引号替代雙引号引用字符串;
48、“用 i+=1 代替 i=i+1。符合 c/c++的(de)習慣,效率還高”;
49、對 global 變量,應該用完就(jiù) unset()掉;