新聞資訊

提高(gāo)PHP編程效率的(de)50‌‍$個(gè)方法

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