在做效能優化之前,我們必須會用工具來測試我們的php服務的效能。
ab命令最主要有兩個引數
引數說明
-n請求數
-c併發數
使用方法如下:
ab -n 100 -c 10
可以得到測試結果:
壓測結果中最重要的是:
requests per second : 每秒能夠處理的請求數
time per request : 處理每個請求所用時間
我們可以在不斷地優化後,通過不斷地壓測,觀測這兩個值的變化,來評估優化效果。
xhprof是faccbook推出的效能測試工具,具體使用請參考使用xhprof查詢php效能瓶頸
優化php效能,最根本的就是從我們所寫的**上進行優化,主要有以下幾點:
在平時開發過程中,要盡量少寫**,能夠用php自帶的函式,常量和變數解決問題時,就不要自己寫。因為在請求量很大時,大量的編譯過程會影響php的效能。
自己寫php**,要經過上圖所示的流程,而使用內建的函式,至少可以省去從php**掃瞄轉化為zend引擎可識別的語法這一步驟。
<?php
$start = microtime(true);
$i = 0;
$arr = range(1,500000);
while($i
<500000)
$end = microtime(true);
echo
'用時'.($end - $start)*1000 . "ms\n";
上面一段**,我們建立了50w個元素的陣列,分別用isset
方法和array_key_exists
方法來判斷鍵是否存在,並用microtime
來記錄用時,測試發現使用isset
方法更快,大約快幾十毫秒。
有人說這點差別無所謂的,沒錯,一般情況下這點效能差異是無所謂的,但是如果是在大專案,億級訪問的專案中,每一處一絲絲的效能差異,累計起來也是不可小覷的。
魔法函式的使用為開發者帶來了很多的便利,但是它有一定的效能開銷,在使用的時候,應當權衡利弊,不可盲目使用。
大家都知道,使用@符號,可以讓php**不報錯,不丟擲異常,這樣開發者可以不用處理錯誤,但是這是懶人的做法,實際上這是有效能開銷的。
@符號的作用原理是:在有@符號這一行**前面和後面分別加上一段opcode, 先將報錯級別設為不報錯,再改回來。相當於使用了error_reporting
為了證明@符號的作用原理,我們可以借助php的乙個擴充套件vld
來檢視相關的opcode(安裝vld過程不在此說明)
先準備一段** test.php :
<?php
file_get_contents('hehe.log');
使用vld檢視opcode:
php -dvld.active=1 -dvld.execute=0 test.php
結果如下:
可以看到,這段**有三段opcode。如果加上@符號@file_get_contents('hehe.log');
,再次檢視opcode,可以看到多了兩行opcode:
除了上述原因外,@符號還有麻痺開發者,讓開發者很容易忽視一些需要處理的錯誤,因此盡量少用@符號。
雖然php有記憶體**機制,但是我們開發者也要注意,建議使用完的變數及時unset,尤其是大陣列。
正規表示式,匹配的字串越多越長,回溯的開銷越大,能用字串處理函式處理的,就不要用正規表示式。
如:
for($i = 0;$i
$arr);$i++)
這段**中使用了strlen計算資料長度,每次迴圈的時候都會重複計算,多了很多不必要的開銷,建議提取出來計算。
php語言特性決定了php不適合做密集型運算業務,也就是不適合做大資料運算
所謂周邊問題,是指php執行的環境,作業系統,硬碟,記憶體,資料庫等問題。
操作檔案是對磁碟進行io操作,相比於記憶體操作和資料庫操作來說,磁碟io操作開銷較大。
發起網路請求有一些影響因素,如對方介面穩定性問題,網路穩定問題。
建議:設定超時時間(連線超時200ms,讀超時800ms,寫超時500ms)
序列請求並行化(使用curl_multi_*()
或swoole擴充套件)
gzip壓縮雖然可以減小傳輸資料,但是會增加cpu的額外開銷,在使用壓縮的時候,要平衡利弊,不可盲目使用
多次訪問,且內容不變的頁面,請使用快取
一般我們處理業務都是序列執行,假設有4個步驟分別是p1,p2,p3,p4,依次執行。執行時間為四個步驟時間總和。
而時間視窗重疊就是在p1還沒處理完時,就開始處理p2,而不是序列執行。p3和p4也是同理。前提是p2不強依賴於p1,p3和p4同理。模型如下:
這樣一來就能減少整個業務處理的時間。
時間視窗重疊是一種思想,而不是具體的技術手段,我們應當根據業務,合理的使用這種思想去解決問題旁路方案和時間視窗重疊是類似的。
旁路方案: 在處理業務過程中,從某個節點分出乙個或多個分支來並行執行,從而減少整個業務處理的時間。
優化php效能
優化php效能的五個實用技巧 以下是五個優化技巧,熟練掌握後對於開發還是很有幫助的。1.對字串使用單引號 php 引擎允許使用單引號和雙引號來封裝字串變數,但是這個是有很大的差別的!使用雙引號的字串告訴 php 引擎首先去讀取字串內容,查詢其中的變數,並改為變數對應的值。一般來說字串是沒有變數的,所...
php 效能優化
1 使用 優化工具 zend optimizer,原理是通過檢測zend引擎產生的中間 並且優化他 來提高速度 安裝 zend optimizer,在php.ini裡新增 zend optimizer.optimization level 15 zend extension path to zend...
PHP效能優化
php效能優化 程式優化 1 最好是使用字串連線與單引號,而不是雙引號字串。2 不要隨便複製變數。3 盡量使用echo輸出字串。4 盡量不要使用連線符,輸出多個變數時可以用逗號分開。5 盡量使用switch代替if else。6 不做無畏的替換,先用strpos查詢再做替換,不要做替換效率高200 ...