2016年12月12日10:00:16
======================
網頁訪問速度的提升,是可以通過代碼的優化來實現的。代碼的優化,並不是說代碼越少越好,而是主要看代碼的運行能力和執行效率,看其消耗CPU和內存的多少。例如Facebook近來就宣布通過代碼優化而將網站性能提高了一倍,平均訪問時間從5s降至2.5s,這個結果無疑是極其誘人的。
PHP是一門很多人正在使用的語言,在網站開發上PHP的使用廣泛度超過ASP和ASP.NET,看看時下流行的CMS和博客用什么語言來開發的就知道了。
其實PHP入門很容易,尤其是對於一個已經接觸過程序編寫的人來說,而對於沒有接觸過程序語言的菜鳥來說,學習用PHP做一個輸出hello world的網頁也很輕松。
然而要編寫高效率的代碼,並不是所有懂程序的人都可以編寫出來的,這需要經過多年的研究積累和經驗總結。
本文將給大家提煉一些PHP代碼優化的實例,利用這些優化,PHP代碼的運行能力將會大大提高,速度提升5倍以上有些情況下並不是不能出現。
1、echo 比 print 快
echo和print是PHP程序中經常使用的指令,尤其是需要調試的時候。echo和print都能輸出一段信息,但經測試發現,echo運行速度會比print快,因此在程序編寫是應使用echo而非print。但是有時候也需要用到print,echo不能完全代替print。請看php echo()和print()有什么區別。
2、連接符用逗號而不是句號
php里逗號和句號都可以起到連接符的作用,關於如何優化輸出,可以看這里如何優化php字符串echo輸出。
此外,輸出多個字符串時,用逗號代替句點來分隔字符串,速度更快。
---------------------------------------
如下4種方式,都能得到同樣的結果,但是,只有第4種方式是最好的。
- $foo = 'John SMITH';
- echo "Hello $foo, welcome on my website.";
- echo "Hello " . $foo . " welcome on my website.";
- echo 'Hello ' . $foo . ' welcome on my website.';
- echo 'Hello ', $foo , ' welcome on my website.';
我敢肯定你們都知道echo '$foo'是不會工作的,但是,我十分肯定的告訴你,那就是使用雙引號去顯示一個簡單的信息,那是非常不好的。
讓我們開始吧。第一個不能運行(第二個也一樣),因為使用雙引號會強制php為此字符串尋找替換值。
第二個好一些,因為php沒有替換需要執行的。
第三個更好,因為使用了單引號,因此語言知道你能夠脫離進程傳送文本,但是“不好”的事情是使用了連接符(不操作,就行第二個例子一樣)。
最后一個使用了單引號,並且加了一個連接符。為什么這樣處理最好呢?
好吧,讓我們看看當使用第三種方法時會發生什么。
php創建一個字符串,包含“Hello”,然后擴充它,加上foo變量(“John SMITH”),然后,再次擴充它,加上“Welcome on my website.”語句,然后,echo能使用它。
然而第四個例子,echo唯一做的一件事是發送“Hello”,接着輸出$foo的內容,再輸出“Welcome on my website.”。因為echo僅僅是發送文本而沒有創建一個需要擴充內容的字符串。
創建一個基准測試后結果如下:
0.0022029876709
0.00211095809937
0.00213599205017
0.00551700592041
第四種方法的執行速度最慢。
從這篇文章,我們應該明白如何優化php字符串連接符,從而提高程序運行速度。
你知道嗎?“,”逗號也可作php連接符
在上述第四個例子里,發現原來“,”逗號也可作php的連接符的,我們大家一般都是使用一點“.”作連接符的。
據說,這可能是從C開始帶過來的習慣,printf這類的輸出都是變參的,echo也繼承了這個優良傳統。不過需要明白的是,這里的逗號是參數間隔符,不是字符串連接符。
------------------------------------
再來個,逗號與句號的區別
echo $str,$str2,$str3;
使用逗號進行運算是逐個輸出運算結果
而
echo $str.$str2.$str3;
使用點號是先對所有字符串進行運算得到結果再輸出。
這樣看當然是 逗號的效率比點號高。 因為逗號連接是不需要運算的。
------------------------------
1. echo 'abc'.'def'; //用點號連接字符串
2. echo 'abc','def'; //用逗號連接字符串
也許很多人都知道逗號要比點號快.但是不知道為什么.更不知道這兩者到底有什么區別.
那么下面我們就舉一些例子.來認清楚他們之前的區別.
1. echo '1+5=' . 1+5;
看看上面的.輸出的結果是6..而不是1+5=6.有些神奇吧?
更神奇的是你看下面的例子.
1. echo "1+5=" . 5+1; //輸出2
結果十分奇怪.我們看到.我們把5和1換下位置.結果就變成2了.
為什么會這樣.難道在PHP中加法是沒有交換律的?當然不是..
我們先不去想為什么.如果我把上面的點號換成逗號試下.
1. echo '1+5=' , 5+1; //輸出 1+5=6
2. echo '1+5=' , 1+5; //輸出 1+5=6
可以看出.只有使用逗號我們才可以得到意料中的結果.
那為什么點號就不行呢?逗號為什么就行呢?
1. echo ('1+5' . 5)+1; //輸出2 ,這里字符串轉化成整形是 1 ,所以1+1等於2了,php運算類型會自動轉換
我們給前面的加個括號后.得到的結果是一樣的.證明PHP是先連接字符串再進行加法計算了.按照從左向右的方向進行的.
那么好.既然是先連接的字符串.那么就應該是"1+55"了.然后再用這個字符串加上1.那為什么就會輸出2呢?
這個跟PHP中字符串變成數字的機制是相關的.我們來看下面的例子
1. echo (int)'abc1'; //輸出0
2. echo (int)'1abc'; //輸出1
3. echo (int)'2abc'; //輸出2
4. echo (int)'22abc'; //輸出22
從上面的例子我們可以看出.如果將一個字符串強制轉換成一個數字.PHP會去搜索這個字符串的開頭.如果開頭是數字就轉換.如果不是就直接返回0.
回到剛才的1+55.既然這個字符串是1+55.所以強制類型轉換后就應該是1了.在此基礎上加1.當然是2了.
為了證明我們的猜想.我們來驗證一下.
1. echo '5+1=' . 1+5; //輸出10
2. echo '5+1=' . 5+1; //輸出6
3. echo '1+5=' . 1+5; //輸出6
4. echo '1+5=' . 5+1; //輸出2
結果證明.我們的設想是正確的.
那么為什么使用逗號就沒有上面的問題了呢?
手冊上說了.用逗號是multiple parameters.
也就是說是多參數.換句話說.
逗號分隔開的就相當於是N個參數.也就是說把echo當個函數用.
這樣的話.echo會對每個參數先進行計算.最后再進行連接后輸出.所以我們用逗號就不存在上面的問題了
3、在執行for循環之前確定最大循環數,不要每循環一次都計算最大值。
這條准則同樣適用於任何語言,這個是編程習慣,但這個習慣很不好,不管你使用什么語言。
// 在每次循環中sizeof函數都要被調用
for ($i = 0; $i < sizeof($post_data); $i++)
{
do_something();
}
// 您可以在循環起始部分對這個不變的量賦值
for ($i = 0, $size = sizeof($post_data); $i < $size; $i++)
{
do_something();
}
4、使用選擇分支語句(譯注:即switch case)好於使用多個if,else if語句。
if else if 的使用非常普遍,在其他語言里也一樣,這個寫法好像更符合人的說話習慣,但是在程序里這樣寫並不太好,它在效率上比switch case要低。所以,一旦程序里需要多個判斷時,就應該用switch case而不要再用if else if else if這樣。
5、數據庫連接當使用完畢時應關掉
在操作數據庫時,很多程序員往往忘記關掉數據庫連接,或許他們沒有這個習慣。數據庫連接是需要消耗內存為代價的,連接數越多內存消耗就越多,所以在實際應用中都必須及時關閉不需要用到的連接,以釋放內存,緩解服務器壓力。
6、錯誤消息代價昂貴
錯誤消息一般用於調試,它的執行效率其實是很低的,速度上會比直接運行慢很多。所以,在程序不需要抓取錯誤消息時,就不要用。
7、局部變量要合理使用
盡量不要在for循環中使用函數,比如for ($x=0; $x prop++)要比遞增一個局部變量慢3倍。
遞增一個未預定義的局部變量要比遞增一個預定義的局部變量慢9至10倍。
僅定義一個局部變量而沒在函數中調用它,同樣會減慢速度(其程度相當於遞增一個局部變量)。PHP大概會檢查看是否存在全局變量。
8、用單引號代替雙引號來包含字符串
實踐證明,用單引號代替雙引號來包含字符串,這樣做會更快一些。
因為PHP會在雙引號包圍的字符串中搜尋變量,單引號則不會。當然,只有當你不需要在字符串中包含變量時才可以這么做。更多分析請看實例分析php單引號和雙引號的區別。
9、mod_zip你用了嗎
mod_zip可作為Apache模塊,用來即時壓縮你的數據,並可讓數據傳輸量降低80%。
10、緩存的使用
除非腳本可以緩存,否則每次調用時都會重新編譯一次。引入一套PHP緩存機制通常可以提升25%至100%的性能,以免除編譯開銷。
盡量做緩存,可使用memcached。memcached是一款高性能的內存對象緩存系統,可用來加速動態Web應用程序,減輕數據庫負載。對運算碼 (OP code)的緩存很有用,使得腳本不必為每個請求做重新編譯。
11、網頁用html而非php
毫無疑問,html靜態頁面的訪問速度是最快的,現在的CMS,都是可以在后台生成全站HTML靜態頁面的,這不僅可以提高用戶訪問網頁的速度,而對於搜索引擎的收錄和排名也是非常有利的。
以上幾點是本文提煉出來的PHP優化方法,當然,優化PHP絕非僅此一點,所謂學無止境,許許多多的優化方法和技巧,需要我們在實踐中不斷總結和運用。
