【小(xiǎo)編推薦】php編程注意的(de)50個(gè)細節ε≠₹α

2016-06-06  &nbs​★p;|   發布者:梁國(guó)& 芳   |   ♦ε;查看(kàn):3320次

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