您好,登錄后才能下訂單哦!
小編給大家分享一下PHP性能問題分析+優化的案例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
什么情況下,遇到了PHP性能問題?
1 PHP語法使用的不恰當
2 使用PHP語言做不了它不擅長做的事
3 用php語言連接的服務不給力
4 PHP自身的短板
5 我也不知道的問題
性能問題解析
PHP的性能問題,占整個項目性能問題的比例 不到50%
性能優化項目,不要局限于僅優化PHP
php語言級的性能優化
|
|
|
php周邊問題的性能優化
|
|
|
php語言自身分析,優化
PHP 壓力測試工具ab簡介
Apache Benchmark(ab)(可以自行下載)
ab是由Apache提供的壓力測試軟件,安裝apache服務器時會自帶該壓測軟件。
如何使用?
./ab -n1000 -c100 http://www.baidu.com/
-n請求數
-c并發數
url目標壓測地址
PHP-壓力測試工具使用演示
主要關注 每秒并發盡可能的多
請求耗時盡可能的少
多使用PHP自身能力
優化:少寫代碼,多用PHP自身能力
性能問題: 自身代碼冗余較多,可讀性不佳,并且性能低
為甚性能低?
PHP代碼需要編譯解析為底層語言,這一過程每次請求都會處理一遍,開銷大。
好的方法:
多使用PHP內置變量\常量\函數
PHP自身能力性能測試之代碼準備
php代碼運行流程
*.php ---Scanner---> Exprs -----Parser--->Opcodes---Exec--->Output
php內置函數之間的性能測試
優化點:php內置函數的性能優劣
情況描述: php內置函數,之間依然存在塊慢差異
好的建議: 多去了解PHP內置函數的時間復雜度
php內置函數之間的性能測試之代碼測試
isset($arr[$i]); //平均50ms
array_key_exists($i,$arr);//平均85ms
減少PHP魔法函數的使用
情況描述: PHP提供的魔法函數,性能不佳
為什么性能低 為了給PHP程序猿省事 PHP語言為你做了很多
好的方法 盡可能規避使用PHP魔法函數
PHP 禁用錯誤抑制符
@的實際邏輯
在代碼開始前 結束后 增加 Opcode 忽略報錯
php -dv|d.active=1 -dv|d.execute=0 at.php
只是想查看并不是真的想執行
PHP-合理的使用內存和正則表達式
優化點:合理使用內存
PHP有內存回收機制保底,但也請小心使用內存
好的建議
利用unset() 及時釋放不使用的內存(注:unset()出現注銷不掉的情況)
盡量少的使用正則表達式
正則表達式的回溯開銷較大,
好的建議:
利用字符串處理函數,實現相同邏輯
PHP-避免在循環內做運算
優化點:避免在循環內做運算
情況描述:
循環內的計算式將會被重復計算
代碼示例:
<?php
$str = "hello world";
for($i=0;$i<strlen($str);$i++)
{
//do something
}
PHP-減少計算密集型業務
PHP不適合密集型運算的場景
PHP語言特性決定了PHP不適合做大數據量運算
PHP適合場景
適合銜接Webserver與后盾服務,UI呈現
PHP-務必使用帶引號字符串做鍵值
PHP會將沒有引號的鍵值當做常量,產生查找常量的開銷
嚴格使用引號的字符串作為鍵值
PHP周邊問題的分析與闡述
PHP周邊都有什么?
linux運行環境 php 硬盤(文件存儲) 數據庫(例如mysql) 緩存 網絡
php周邊對PHP程序的影響分析
減少文件類的操作
常見PHP場景的開銷次序:
讀寫磁盤 讀寫數據庫 讀寫內存 讀寫網絡數據
讀寫內存 << 讀寫數據庫 < 讀寫磁盤 < 讀寫網絡數據
減少PHP發起網絡請求
網絡請求的坑:
1 對方接口的不確定因素
2 網絡穩定性
優化網絡請求
1 設置超時時間
連接超時 200ms
讀超時 800ms
寫超時 500ms
2 將串行請求并行化
1 curl_multi_*()
2 使用swoole擴展
curl_multi_*()不是很好,因為他是按最長的一個返回的時間來定的
curl_multi_add_handle 向curl批處理會話中添加單獨的curl句柄
curl_multi_close 關閉一組cURL句柄
curl_multi_exec 運行當前cURL句柄的子連接
curl_multi_getcontent 如果設置了CURLOPT_RETURNTRANSFER,則返回獲取的輸出的文本流
curl_multi_info_read 獲取當前解析的cURL的相關傳輸信息
curl_multi_remove_handle 移除curl批量處理句柄資源中的某個句柄資源
curl_multi_select 等待所有cURL批處理中的活動連接
curl_multi_setopt Set an option for the cURL multi handle
curl_multi_strerror - Return string describing error code
推薦swoole擴展來做
壓縮PHP輸出的利與弊
壓縮php接口的輸出
如何壓縮?
使用Gzip即可
利 利于我們的數據輸出,Client端能更快獲取數據
弊 額外的CPU開銷
PHP緩存復用
什么情況下做輸出內容的緩存?
多次請求,內容不變情況
Smarty調優和重疊時間窗口思想
Smarty開啟 caching
重疊時間窗口思想
串行:
Process1 Process2 Process3 Process4
重疊時間窗口:
process1
process2
process3
process4
后一個任務不強依賴前一個任務的時候,可以使用重疊時間
PHP旁路處理方案
一般普通的:x.php -> Process1 ->process2 ->process3 -> process4->
旁路方案: x.php -> Process1 ->process2(同時) ->Process3 (同時) -->Process4->
以上是PHP性能問題分析+優化的案例的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。