來源:不言 發(fā)布時間:2019-03-23 15:16:47 閱讀量:1277
本篇文章給大家?guī)淼膬?nèi)容是關(guān)于php性能優(yōu)化的理論知識講解,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
什么情況下,遇到了PHP性能問題?
1 PHP語法使用的不恰當(dāng)
2 使用PHP語言做不了它不擅長做的事
3 用php語言連接的服務(wù)不給力
4 PHP自身的短板
5 我也不知道的問題
性能問題解析
PHP的性能問題,占整個項(xiàng)目性能問題的比例 不到50%
性能優(yōu)化項(xiàng)目,不要局限于僅優(yōu)化PHP
php語言級的性能優(yōu)化
|
|
|
php周邊問題的性能優(yōu)化
|
|
|
php語言自身分析,優(yōu)化
PHP 壓力測試工具ab簡介
Apache Benchmark(ab)(可以自行下載)
ab是由Apache提供的壓力測試軟件,安裝apache服務(wù)器時會自帶該壓測軟件。
如何使用?
./ab -n1000 -c100 http://www.baidu.com/
-n請求數(shù)
-c并發(fā)數(shù)
url目標(biāo)壓測地址
PHP-壓力測試工具使用演示
主要關(guān)注 每秒并發(fā)盡可能的多
請求耗時盡可能的少
多使用PHP自身能力
優(yōu)化:少寫代碼,多用PHP自身能力
性能問題: 自身代碼冗余較多,可讀性不佳,并且性能低
為甚性能低?
PHP代碼需要編譯解析為底層語言,這一過程每次請求都會處理一遍,開銷大。
好的方法:
多使用PHP內(nèi)置變量\常量\函數(shù)
PHP自身能力性能測試之代碼準(zhǔn)備
php代碼運(yùn)行流程
*.php ---Scanner---> Exprs -----Parser--->Opcodes---Exec--->Output
php內(nèi)置函數(shù)之間的性能測試
優(yōu)化點(diǎn):php內(nèi)置函數(shù)的性能優(yōu)劣
情況描述: php內(nèi)置函數(shù),之間依然存在塊慢差異
好的建議: 多去了解PHP內(nèi)置函數(shù)的時間復(fù)雜度
php內(nèi)置函數(shù)之間的性能測試之代碼測試
1 2 |
|
減少PHP魔法函數(shù)的使用
情況描述: PHP提供的魔法函數(shù),性能不佳
為什么性能低 為了給PHP程序猿省事 PHP語言為你做了很多
好的方法:盡可能規(guī)避使用PHP魔法函數(shù)
PHP 禁用錯誤抑制符
@的實(shí)際邏輯
在代碼開始前 結(jié)束后 增加 Opcode 忽略報錯
1 |
|
只是想查看并不是真的想執(zhí)行
PHP-合理的使用內(nèi)存和正則表達(dá)式
優(yōu)化點(diǎn):合理使用內(nèi)存
PHP有內(nèi)存回收機(jī)制保底,但也請小心使用內(nèi)存
好的建議
利用unset() 及時釋放不使用的內(nèi)存(注:unset()出現(xiàn)注銷不掉的情況)
盡量少的使用正則表達(dá)式
正則表達(dá)式的回溯開銷較大,
好的建議:
利用字符串處理函數(shù),實(shí)現(xiàn)相同邏輯
PHP-避免在循環(huán)內(nèi)做運(yùn)算
優(yōu)化點(diǎn):避免在循環(huán)內(nèi)做運(yùn)算
情況描述:
循環(huán)內(nèi)的計算式將會被重復(fù)計算
代碼示例:
1 2 3 4 5 6 |
|
PHP-減少計算密集型業(yè)務(wù)
PHP不適合密集型運(yùn)算的場景
PHP語言特性決定了PHP不適合做大數(shù)據(jù)量運(yùn)算
PHP適合場景
適合銜接Webserver與后盾服務(wù),UI呈現(xiàn)
PHP-務(wù)必使用帶引號字符串做鍵值
PHP會將沒有引號的鍵值當(dāng)做常量,產(chǎn)生查找常量的開銷
嚴(yán)格使用引號的字符串作為鍵值
PHP周邊問題的分析與闡述
PHP周邊都有什么?
linux運(yùn)行環(huán)境 php 硬盤(文件存儲) 數(shù)據(jù)庫(例如mysql) 緩存 網(wǎng)絡(luò)
php周邊對PHP程序的影響分析
減少文件類的操作
常見PHP場景的開銷次序:
讀寫磁盤 讀寫數(shù)據(jù)庫 讀寫內(nèi)存 讀寫網(wǎng)絡(luò)數(shù)據(jù)
讀寫內(nèi)存 << 讀寫數(shù)據(jù)庫 < 讀寫磁盤 < 讀寫網(wǎng)絡(luò)數(shù)據(jù)
減少PHP發(fā)起網(wǎng)絡(luò)請求
網(wǎng)絡(luò)請求的坑:
1 對方接口的不確定因素
2 網(wǎng)絡(luò)穩(wěn)定性
優(yōu)化網(wǎng)絡(luò)請求
1 設(shè)置超時時間
連接超時 200ms
讀超時 800ms
寫超時 500ms
2 將串行請求并行化
1 curl_multi_*()
2 使用swoole擴(kuò)展
1 2 3 4 5 6 7 8 9 10 |
|
推薦swoole擴(kuò)展來做
壓縮PHP輸出的利與弊
壓縮php接口的輸出
如何壓縮?
使用Gzip即可
利 利于我們的數(shù)據(jù)輸出,Client端能更快獲取數(shù)據(jù)
弊 額外的CPU開銷
PHP緩存復(fù)用
什么情況下做輸出內(nèi)容的緩存?
多次請求,內(nèi)容不變情況
Smarty調(diào)優(yōu)和重疊時間窗口思想
Smarty開啟 caching
重疊時間窗口思想
串行:
Process1 Process2 Process3 Process4
重疊時間窗口:
process1
process2
process3
process4
后一個任務(wù)不強(qiáng)依賴前一個任務(wù)的時候,可以使用重疊時間
PHP旁路處理方案
一般普通的:x.php -> Process1 ->process2 ->process3 -> process4->
旁路方案: x.php -> Process1 ->process2(同時) ->Process3 (同時) -->Process4->