新聞資訊

提高(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àng)了(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,__autoload。
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)時(shí)間(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['REQUEST_TIME'] 要(yào)好(hǎo)于 tim$e()
10、函數(shù)代替正則表達式完成相(xiàng)同功能(néng)。
11、str_replace 函數(shù)比 preg_replace 函數(shù)快(kuài),但(dàn) strtr 函數(shù)的(de)效率是(shì) st$r_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)參數(shù)。
13、使用(yòng)選擇分(fēn)支語句(譯注:即 switch case)好(hǎo)于使用(yòng)多(duō)個(αgè) if,else if 語句。
14、用(yòng)@屏蔽錯(cuò)誤消息的(de)做(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ì)最快(kuà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)與類中定義的(de)方法的(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òng)所花(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)态 HTML 頁面,少(shǎo)用(yòng)腳本。
27、除非腳本可(kě)以緩存,否則每次調用(yòng)時(shí)都(dōu)會(huì)重新編譯一(yī)次。引入一(yī)套 PH P 緩存機(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)程序,減輕數(shù)據庫負•載。對(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) 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ò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òng) 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 shor≤t”$$ } 調用(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)銷。
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 條指令(opcodes),$i++則需要(yào) 4↔ 條指令。後置遞增實際上(shàng)會(huì)産生(shēng)一(yī) 個(gè)臨時(shí)變量,這(zhè)個(g♠è)臨時(shí)變量随後被遞增。而前置遞增直接在原值上(shàng)遞增。這(zhè)是(shì)最優化(huà)處理(lǐ↑)的(de) 一(yī)種,正如(rú) Zend 的(de) PHP 優化(huà)器(qì)所作(zuò)的(de)那(nà)樣。牢記這(zhè)個(gè)優化(h€uà)處理(lǐ)不(bù)失為(wèi)一(yī)個(gè)好(hǎo)主意,因為(wèi) 并不(bù)是(shì)所有(yǒu)的(de)指令優化(huà)器(qì)都(dōu)會(h​uì)做(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)過多(duō),仔細想想你(nǐ)真正打算(suàn)重用(yòng)的(de)是(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)多(dαuō)少(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) file_get_contents 替代 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)題;
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à)盡量少(shǎo‌)的(de)進行(xíng) Insert、Update 操作(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)情況下(xià),不(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)完就(jiù) unset()掉;