在PHP優(yōu)化前可以使用apache Benchmark來進(jìn)行壓力測試萨惑,查看當(dāng)前服務(wù)器的性能:
ab -n 100 -c 10 https://www.baidu.com/
Server Software: bfe/1.0.8.18
Server Hostname: www.baidu.com
Server Port: 443
SSL/TLS Protocol: TLSv1,AES128-SHA,2048,128
Document Path: /
Document Length: 227 bytes
Concurrency Level: 10
Time taken for tests: 1.406 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 103321 bytes
HTML transferred: 22700 bytes
Requests per second: 71.14 [#/sec] (mean) (百度服務(wù)的每秒請求數(shù))
Time per request: 140.569 [ms] (mean)
Time per request: 14.057 [ms] (mean, across all concurrent requests) 百度服務(wù)的平均每個請求需要的時間(14.057ms)
Transfer rate: 71.78 [Kbytes/sec] received
有以上數(shù)據(jù)可以看出,若要優(yōu)化PHP其實(shí)最重要的是Requests per second和Time per request這兩個參數(shù)钾麸,其中Requests per second越大越好邪乍,Time per request越小越好。而通過不斷的優(yōu)化可以繼續(xù)執(zhí)行ab操作來觀察這兩個參數(shù)西篓,來查看優(yōu)化效果议谷。
優(yōu)化點(diǎn):少寫代碼炉爆,多用PHP自身能力
性能問題:
自身代碼冗余較多,可讀性不佳,并且性能低芬首。
為什么性能低:
PHP代碼需要編譯解析為底層語言赴捞,這一過程每次請求都會處理一遍,開銷大衩辟。
好的方法:
多使用 PHP內(nèi)置的函數(shù) 方法 變量
這就要求開發(fā)盡可能多的掌握內(nèi)置函數(shù) 和 常量螟炫。(另外要知道內(nèi)置函數(shù)也是存在有性能差異的,因此需要盡可能多的了解內(nèi)置函數(shù)的時間復(fù)雜度的)
優(yōu)化點(diǎn):少用魔法函數(shù)
為什么低艺晴?:
為了給PHP程序員省事昼钻,PHP語言做了很多。
好的方法:
盡可能避免使用PHP魔法函數(shù)
優(yōu)化點(diǎn):產(chǎn)生額外開銷的錯誤抑制符@
PHP提供的錯誤抑制符只是為了方便“懶人”
@的實(shí)際邏輯:
在代碼開始前封寞,結(jié)束后然评,增加Opcode,忽略報錯
好的建議:
盡量不使用@錯誤抑制符
優(yōu)化點(diǎn):合理使用內(nèi)存
情況:
PHP有內(nèi)存回收機(jī)制狈究,但也要小心使用內(nèi)存碗淌。
好的建議:
利用unset()及時釋放不使用的內(nèi)存(注:unset()出現(xiàn)注銷不掉的情況)
優(yōu)化點(diǎn):少使用正則表達(dá)式
情況:
正則表達(dá)式的回溯開銷較大,“不要亂用”
優(yōu)化點(diǎn):避免在循環(huán)內(nèi)做運(yùn)算
情況描述:
循環(huán)哪的計算式將會被重復(fù)計算
代碼示例:
<?php
$str = "hello world";
for($i = 0;$i<strlen($str);$i++){
//do something
}
優(yōu)化點(diǎn):減少計算密集型業(yè)務(wù)
情況:
PHP不適合密集型運(yùn)算的場景
為什么:
PHP是在C語言之上的抖锥,語言特性決定了PHP不適合做大數(shù)據(jù)運(yùn)算(都需要C來實(shí)現(xiàn))
PHP適用場景:
適合銜接WebService與后端服務(wù)亿眠,UI呈現(xiàn)。
優(yōu)化點(diǎn):少用魔法函數(shù)
為什么低磅废?:
為了給PHP程序員省事纳像,PHP語言做了很多。
好的方法:
盡可能避免使用PHP魔法函數(shù)
優(yōu)化點(diǎn):務(wù)必使用帶引號的字符串做鍵值
情況:
PHP會將沒有引號的鍵值當(dāng)作常量拯勉,產(chǎn)生查找常量的開銷竟趾。
因?yàn)槿舨粚憽啊保瑒t會先查找define的常量表宫峦,當(dāng)常量表中找不到岔帽,才會作為key值去數(shù)組中查找,多了常量表的查詢导绷。如果有意外的常量定義犀勒,也會影響代碼的健壯性。