PHP小組:Google提供的網(wǎng)站加速PHP技巧真是胡說八道
原創(chuàng)【51CTO快譯】Google小組上周共享了其網(wǎng)站加速的技巧大全,其中包括了一些PHP性能技巧。然而這些PHP性能技巧在PHP社區(qū)中引起了一陣軒然大波,PHP小組立刻寫了一篇公開信給這些性能技巧“抓蟲”。有關(guān)Google的建議,51CTO這幾日做了整理,做出文章《加速,加速,再加速:來自Google的網(wǎng)站加速技巧大全》。其中第四頁的后半部分就是專門講PHP相關(guān)的性能技巧,在閱讀本文之前可以先熟悉一下。
以下是來自PHP小組的信件譯文:
PHP小組:這篇文章中所給的建議全部都是錯(cuò)誤的。
1. 沒有原因盡量不要復(fù)制變量
PHP 4和5核心的Zend引擎使用了一個(gè)名為“copy-on-write”的內(nèi)存管理系統(tǒng)。也就是說,無論你將一個(gè)變量的值賦值給另一個(gè)變量多少次,只要你不改變數(shù)值,數(shù)據(jù)是不會(huì)被復(fù)制的。范例:
- $data = str_repeat("*", 512 * 1024); // synthesize 512K of data
- $memory_used_before = memory_get_usage();
- $more_data = $data;
- $memory_used_after = memory_get_usage();
- print "Before: {$memory_used_before}\nAfter: {$memory_used_after}\n";
有thread-safety及調(diào)試功能的PHP 5.3下:
之前:853968
之后:854236
沒有thread-safety及調(diào)試功能的PHP 5.2下:
之前:581912
之后:581976
也就是,調(diào)試模式下有268字節(jié)的差別,正常模式下(普遍使用的)有64字節(jié)的差別。這和Google文中所述(51CTO編者注:Google原文的描述中,復(fù)制變量會(huì)“導(dǎo)致雙倍的內(nèi)存消耗”)相差甚遠(yuǎn)。
需要注意的是,PHP代碼中堅(jiān)決禁止在沒有恰當(dāng)過濾的情況下將用戶提供的變量原本內(nèi)容進(jìn)行echo或者存儲(chǔ)。
2. 為長(zhǎng)字符串使用單引號(hào)
針對(duì)PHP 5.2及5.3的基準(zhǔn)測(cè)試顯示,雖然雙引號(hào)使用竄改(interpolation)而單引號(hào)使用連鎖(concatenation),這兩個(gè)的速度是完全一致的(甚至雙引號(hào)常常會(huì)更快一些)。當(dāng)使用沒有包含變量的普通字符串時(shí),使用雙引號(hào)的性能要明顯占優(yōu)。
3. 使用echo而非print
這兩個(gè)方法的運(yùn)行速度取決于你的PHP是如何設(shè)置在host上的。
4. 不要與echo一起使用concatenation(連鎖)
事實(shí)正好相反。新的引擎處理多條echo的方法,導(dǎo)致在echo中使用concatenation實(shí)際上會(huì)比較快。
5. 使用switch/case替代if/else
最后,這句建議是徹底的胡說八道。決定在哪里使用switch/case或者if/else完全取決于編碼習(xí)慣,他們的運(yùn)行速度基本一致,除了在某些特定的情況下。
事實(shí)上,在更古老的PHP版本下(PHP 3及很老的PHP 4版本)這些大部分建議是正確的,然而在新一代的PHP下,這些絕對(duì)是錯(cuò)誤的。
【編輯推薦】