一、工具
xhprof是一款性能分析工具,在php開發中可以精確分析到每行代碼每個方法所消耗的時間和性能等。
二、安裝xhprof
我是在本地使用phpstudy的php7.3.4nts 集成環境,若你要是linux環境可以參考xhprof安裝和使用方法
下載方式你可以選擇
下載好後將php_xhprof.dll 文件配置在本地php安裝目錄\ext 裏,然後修改php.ini文件
extension=php_xhprof.dll
xhprof.output_dir="D:\caoxiukang\probject\project\xhprof_log" // 日誌文件的目錄
此時拓展文件已經裝好頁面輸出phpinfo() 查看
則爲成功。
然後配置xhprof基礎文件,下載地址百度網盤 提取碼:aydr
你也可以去官網下載 xhprof
下載後我解壓到 圖一配置的目錄下
三、調試
解壓到這裏就好了,然後我們在需要分析的代碼裏配置調試
上圖中地17 行就是我自己的代碼,第19行需要配置xhprof的安裝地址,也就是圖2解壓到的地址。
然後調用這個接口,然後在這個目錄下會生成日誌文件。
這個就是生成的日誌,日誌文件名前面一部分是 xhprof運行編號,後面的getColumnGoods是代碼裏自己配置的名字。這樣子就可以直接查看了。但是不是很直觀。需要配置站點。
打開xhprof-0.9.4目錄下會發現有xhprof_html 目錄,這個目錄就是用來將日誌文件解析到瀏覽器上的。
配置的站點需要將入庫文件寫成index.php文件。配置好後訪問如下
四、表格的方式
我訪問的地址是 http://127.0.0.1:3000/?run=5e97f92ec9c7e&source=getColumnGoods&all=1
run是生產的編號 source 是圖三代碼裏設置的後綴。
下面的部分就是分析出來代碼每行運行的結果。
五、圖表方式 -graphviz
其實上面的表格查看方式以及很清晰了,也可以選擇以圖表方式查看
安裝 graphviz 百度網盤地址 提取碼 e1wh 下載安裝到隨意地址。
下載好了然後 點擊頁面上的 [View Full Callgraph]
排錯:
1.有的可會出現 Xhprof graphviz Warning: proc_open() [function.proc-open]: CreateProcess failed, error code
錯誤這時需要去php.ini裏將 disable_functions 裏的proc_open 方法去掉。
2.如果去掉後還有報錯,那就去
xhprof_log\xhprof-0.9.4\xhprof_lib\utils\callgraph_utils.php
的 112行proc_open的方法前面加@ 方法
3.如故還報錯,那可能就是graphviz的安裝目錄有問題,需要改一下。
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], $dot_script);
fclose($pipes[0]);
$output = stream_get_contents($pipes[1]);
$err = stream_get_contents($pipes[2]);
if (!empty($err)) {
print "failed to execute cmd: \"$cmd\". stderr: `$err'\n";
exit;
}
fclose($pipes[2]);
fclose($pipes[1]);
proc_close($process);
return $output;
}
print "failed to execute cmd \"$cmd\"";
exit();
}
將原來這塊代碼修改如上就可以了。
然後可以打開圖表如下。
啊啊啊,不敢打開看,頭皮發麻,趕緊優化代碼去。
六、分析
具體每個參數作用根據如下:
Function Name:方法名稱。
Calls:方法被調用的次數。
Calls%:方法調用次數在同級方法總數調用次數中所佔的百分比。
Incl.Wall Time(microsec):方法執行花費的時間,包括子方法的執行時間。(單位:微秒)
IWall%:方法執行花費的時間百分比。
Excl. Wall Time(microsec):方法本身執行花費的時間,不包括子方法的執行時間。(單位:微秒)
EWall%:方法本身執行花費的時間百分比。
Incl. CPU(microsecs):方法執行花費的CPU時間,包括子方法的執行時間。(單位:微秒)
ICpu%:方法執行花費的CPU時間百分比。
Excl. CPU(microsec):方法本身執行花費的CPU時間,不包括子方法的執行時間。(單位:微秒)
ECPU%:方法本身執行花費的CPU時間百分比。
Incl.MemUse(bytes):方法執行佔用的內存,包括子方法執行佔用的內存。(單位:字節)
IMemUse%:方法執行佔用的內存百分比。
Excl.MemUse(bytes):方法本身執行佔用的內存,不包括子方法執行佔用的內存。(單位:字節)
EMemUse%:方法本身執行佔用的內存百分比。
Incl.PeakMemUse(bytes):Incl.MemUse峯值。(單位:字節)
IPeakMemUse%:Incl.MemUse峯值百分比。
Excl.PeakMemUse(bytes):Excl.MemUse峯值。單位:(字節)
EPeakMemUse%:Excl.MemUse峯值百分比。