標籤:緩衝 效能 最佳化 辛星 對象
一代大神Hoare曾經說過:”過早的最佳化是一切不幸的根源。“在我是個小菜鳥的時候,根本不知道這句話是否正確,但是當自己成為一個老鳥之後,就發現這句話是相當的犀利,說的恰到好處,也不愧它能夠流傳這麼廣泛。
要想最佳化PHP的效能,第一點要注意的就是緩衝,有人說過如果PHP使用了緩衝,它的效能會提高五百倍,可惜Zend公司在致力於賣自己的產品,因此一個公司把一門語言給坑了,先不說這個公司的問題,就緩衝的重要性而言,是絕不容忽視的。我們可以用緩衝模組(比如Memcache)或者緩衝模板(Smarty)等來進行一系列的緩衝處理,當然我前面介紹的兩個頁面靜態化和檔案方式快取資料庫資訊的方式也在這一類裡面。
第二點就是記憶體的消耗問題,這點說起來還是比較大的,說幾個細節把,就是有些人喜歡把變數賦值一份,從而增大記憶體開銷,比如我們從GET接收過來的參數,直接用就可以了,非要再賦值給另外一個變數,導致在該變數的記憶體消耗翻倍,比如如下代碼:
<?php//只是為了美觀的新變數$msg = strip_tags($_GET['msg']);echo $msg;
其實直接用如下代碼就可以了:
echo strip_tags($_GET['msg']);
第三點就是其他語言帶過來的弊病,比如Java程式員可能很喜歡寫get函數和set函數,但是作為PHP程式員完全沒必要這麼做,直接操作屬性即可,因為使用這些屬性的話,除了加大開銷之外,沒有做任何有意義的工作。
第四點就是在資料庫的操作上,有些新手喜歡用到一次資料就查一次,其實我們每次串連資料庫再中斷連線的開銷還是蠻大的,我們應該把要做的sql操作放到一起,統一執行,避免多次的資料庫連接和斷開。
第五點就是在include或者require檔案的時候,使用絕對路徑絕對要快很多,另外可以使用自動載入機制,即方便,又保證了效率,關於自動載入,可以看我的一篇博文,今天剛寫的。
第六點就是在某些大塊頭的部分進行調優,很多人喜歡用smarty,如果是大型的網站,還需要考慮到smarty的開銷,有人統計過,smarty會佔據到百分之十的開銷,這點還是非常可觀的。
第七點就是使用單引號代替雙引號來定義字串會讓速度稍微快一點,因為PHP會在雙引號包圍的字串中搜尋變數,但是單引號不會。使用靜態方法也提高速度,因為它避免了類的執行個體化,會節省開銷。使用echo輸出多個字元資訊的時候,使用逗號而不是原點會加快速度,因為它省去了拼接字串的開銷。include檔案的時候使用絕對路徑也會減小開銷,因為它避免了PHP去includ_path裡面尋找檔案的操作,提升效能。
第八點就是對於簡單的字串,不要使用Regex,這樣會加大開銷,使用switch case語句要比多個if。。elseif要最佳化的多,因為它省去了多重判斷的開銷。對於變數的操作的時候,遞增一個局部變數是最快的,遞增一個全域變數要慢大約2倍,遞增一個對象的屬性大約會慢三倍。
第九點就是我們的靜態化的一點原因了,因為Apache解析一個PHP指令碼的速度比解析一個靜態HTML頁面會慢大約2倍到10倍左右,因此,這也是靜態化的優點之一。在我們讀取檔案的時候,能用file_get_contents就使用它,而不是fopen,fread等操作。
最後一點就是foreach的效率比for和while效率高一點,是在想不起來什麼其他的了,如果讀者能夠想到的話,希望補充奧,對了,還有apc這種緩衝,其實我第一點說的就是緩衝。。。
如果提升PHP程式的效能