使用XHProf查找PHP性能瓶頸

使用XHProf查找PHP性能瓶頸

XHProf是facebook 開發的一個測試php性能的擴展,本文記錄了在PHP應用中使用XHProf對PHP進行性能優化,查找性能瓶頸的方法。

下載

網上很多是編譯安裝xhprof-0.9.4版本,應該是用php5,在php8.0下編譯xhprof-0.9.4各種報錯(編譯安裝這個拓展 tideways 不會報錯),php7、php8環境下,建議下載最新版本
https://pecl.php.net/package/xhprof

安裝Xhprof擴展

cd /opt
wget https://pecl.php.net/get/xhprof-2.3.9.tgz
tar -zxvf xhprof-2.3.9.tgz 
cd xhprof-2.3.9
cd extension/
phpize
./configure
make && make install

修改php.ini

[xhprof]
extension=xhprof.so
xhprof.output_dir=/tmp

配置中xhprof.output_dir指定了生成的profile文件存儲的位置,我們將其指定為/tmp。

對PHP進行性能分析

在XHProf擴展中,一共提供了四個函數用于對PHP進行性能分析。

xhprof_enable/xhprof_sample_enable函數用于開始XHProf性能分析,區別在于前者功能更加強大,而后者則是是以簡單模式啟動性能分析(簡單記錄了函數的調用棧信息),開銷比較小。

xhprof_disable/xhprof_sample_disable函數用于停止性能分析,并返回分析的數據。

需要特別說明的函數是xhprof_enable,其他函數都是不需要提供參數的,而該函數則可以接受兩個可選的參數,用于改變該工具的行為。

void xhprof_enable ([ int $flags = 0 [, array $options ]] )
  • flags 該參數用于為剖析結果添加額外的信息,該參數的值使用以下宏,如果需要提供多個值,使用|進行分隔。

  • XHPROF_FLAGS_NO_BUILTINS 跳過所有的內置函數

  • XHPROF_FLAGS_CPU 添加對CPU使用的分析

  • XHPROF_FLAGS_MEMORY 添加對內存使用的分析

  • options 數組形式提供可選參數,在此處提供ignored_functions選項需要忽略的函數

比如下面的例子,同時對內存和CPU進行分析,并且忽略對call_user_funccall_user_func_array函數的分析。

xhprof_enable(XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU,['ignored_functions'    => ['call_user_func','call_user_func_array']]
);// 這里是PHP代碼,比如業務邏輯實現等要被分析的代碼部分
....$xhprofData = xhprof_disable();// $xhprofData是數組形式的分析結果
print_r($xhprofData);

注意,如果使用XHPROF_FLAGS_CPU選項對CPU占用也進行分析,在Linux環境下,會造成比較高的系統負載,因此不建議使用,而推薦只使用XHPROF_FLAGS_MEMORY,對內存的分析不會對系統造成太多負載。

形象化的查看分析結果

安裝graphviz

使用xhprof_disable完成性能分析并且獲取到分析結果之后,我們通常不會直接輸出結果,因為這樣的結果是以數組形式組織的,看起來并不直觀,幸運的是,xhprof提供了基于web的圖形界面對分析結果進行查看。

在使用之前,請先確保服務器安裝了graphviz工具,否則在生成監控圖表的時候回出現以下錯誤:

failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '

這里提示找不到dot命令,所以需要先安裝graphviz

yum -y install graphviz

將xhprof安裝包中的xhprof_html_和xhproflib目錄放到服務器的web目錄下

由于分析結果的查看工具是基于web的,因此,我們需要將xhprof安裝包中的xhprof_html_和xhproflib目錄放到服務器的web目錄下,讓xhprof_html目錄中的內容對外可以訪問。

比如我的測試服務器環境是使用vagrant搭建的CentOS,這兩個目錄放到/opt/xhprof-2.3.9目錄下:

cp -r /opt/xhprof-2.3.9/xhprof_html/ /www/nginx/php/xhprof_html
cp -r /opt/xhprof-2.3.9/xhprof_lib/ /www/nginx/php/xhprof_lib

web服務器使用的是Nginx,因此,修改Nginx的配置文件nginx.conf中的配置如下:

server {location / {root   /www/nginx/php;#等于php;index  index.php index.html index.htm;}location ~ \.php$ {root           /www/nginx/php;fastcgi_pass   127.0.0.1:9000;fastcgi_index  index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #支持解析php文件include        fastcgi_params;}

使用

修改我們的代碼,是其能夠將分析結果存放到xhprof.output_dir(上面在php.ini設置的xhprof.output_dir=/tmp)指定的目錄中。

在 PHP 頁面頂部加上:
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS + XHPROF_FLAGS_MEMORY);
在頁面底部加上:
$xhprofData = xhprof_disable();
require '/vagrant/xhprof/xhprof_lib/utils/xhprof_lib.php';
require '/vagrant/xhprof/xhprof_lib/utils/xhprof_runs.php';$xhprofRuns = new XHProfRuns_Default();//數據會保存在php.ini中xhprof.output_dir設置的目錄去中
$runId = $xhprofRuns->save_run($xhprofData, 'xhprof_test');//第二個參數是定義文件名稱echo 'http://ip/xhprof/xhprof_html/index.php?run=' . $runId . '&source=xhprof_test';

變量$runId是本次請求生成分析結果的id,最后我們訪問http://訪問http://ip 頁面輸出了一個鏈接地址,使用該地址就可以看到本次請求的分析結果。

本次請求的分析結果

注意到中間的View Full Callgraph鏈接,通過該鏈接我們可以看到圖形化的分析結果。

圖形化分析結果

查看安裝結果
[root@xxx /]# php -i | grep xhprof
xhprof
xhprof support => enabled
xhprof.collect_additional_info => 0 => 0
xhprof.output_dir => /tmp => /tmp
xhprof.sampling_depth => 2147483647 => 2147483647
xhprof.sampling_interval => 100000 => 100000
查看分析結果文件
[root@xxx /]# tree /tmp
/tmp
└── systemd-private-be08ad52244846b793f9a5c4600bb4dc-php-fpm.service-UXT6oP└── tmp├── 655f4470f21de.xhprof_test.xhprof└── 655f48cb6e9bf.xhprof_test.xhprof[root@xxx /]# cat /tmp/systemd-private-be08ad52244846b793f9a5c4600bb4dc-php-fpm.service-UXT6oP/tmp/655f4470f21de.xhprof_test.xhprof 
a:1:{s:6:"main()";a:4:{s:2:"ct";i:1;s:2:"wt";i:889;s:2:"mu";i:61200;s:3:"pmu";i:25216;}}

得到的是serialize后的數據

<?php
$str = 'a:1:{s:6:"main()";a:4:{s:2:"ct";i:1;s:2:"wt";i:889;s:2:"mu";i:61200;s:3:"pmu";i:25216;}}';
$arr = unserialize($str);
var_dump($arr);
array(1) {["main()"]=>array(4) {["ct"]=>int(1)["wt"]=>int(889)["mu"]=>int(61200)["pmu"]=>int(25216)}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165901.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165901.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165901.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在CentOS 7上設置防火墻開啟端口訪問

在CentOS 7上開啟38845端口&#xff0c;可以按照以下步驟進行操作&#xff1a; 打開終端或SSH連接到CentOS 7服務器。 使用root或具有管理員權限的用戶登錄。 運行以下命令以開放38845端口&#xff1a; firewall-cmd --zonepublic --add-port38845/tcp --permanent上述命令…

怎么申請IP地址證書?

IP地址證書&#xff0c;也稱為SSL證書&#xff0c;是一種數字證書&#xff0c;用于在網絡傳輸過程中對IP地址進行加密和解密。它是由受信任的證書頒發機構&#xff08;CA&#xff09;頒發的&#xff0c;用于證明網站所有者身份的真實性和合法性。 一、選擇證書頒發機構。首先需…

2015年7月1日 Go生態洞察:GopherChina旅行報告

&#x1f337;&#x1f341; 博主貓頭虎&#xff08;&#x1f405;&#x1f43e;&#xff09;帶您 Go to New World?&#x1f341; &#x1f984; 博客首頁——&#x1f405;&#x1f43e;貓頭虎的博客&#x1f390; &#x1f433; 《面試題大全專欄》 &#x1f995; 文章圖文…

【2023年APMCM亞太杯C題】完整數據與解題思路

2023年亞太杯C題 數據下載與搜集重點數據其余數據第一問第二問第三問第四問第五問第六問 數據與思路獲取 數據下載與搜集 該題并沒有提供數據集&#xff0c;對所需數據進行收集整理是對題目進行求解的基礎。在本題中&#xff0c;主要需要以下數據&#xff1a;新能源汽車歷史銷…

C#,數值計算——多項式插值與外推插值(Poly2D_interp)的計算方法與源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Object for two-dimensional polynomial interpolation on a matrix.Construct /// with a vector of x1 values, a vector of x2 values, a matrix of tabulated /// func…

iview table 默認排序字段不高亮解決辦法

iview treeSelect 組件封裝 1、表格增加排序時觸發的方法2、定義三個變量&#xff0c;sortColumnDefaultStyle存放默認的樣式&#xff0c;定義頁面默認的列以及順序3、顯示的列加上 sortable, 和樣式4、使用下面這塊代表默認選中5、點擊時清除掉默認的排序6、把排序的字段查詢時…

【LeetCode刷題-回溯】-- 47.全排列II

47.全排列II 主要需要解決全排列不重復的問題&#xff0c;設定一個規則&#xff0c;保證在填第i個數的時候重復數字只會被填入一次即可&#xff0c;而在本題中&#xff0c;我們選擇對原數組排序&#xff0c;保證相同的數字都相鄰&#xff0c;然后每次填入的數一定是這個數所在重…

綜合運用DML、DDL、DCL、TCL語句與事務管理

文章目錄 一、介紹二、DML&#xff1a;數據操縱語言三、DDL&#xff1a;數據定義語言四、DCL&#xff1a;數據控制語言五、TCL&#xff1a;事務控制語言六、SELECT 查詢時鎖定 一、介紹 在Oracle數據庫中&#xff0c;掌握和運用DML、DDL、DCL和TCL語句是必不可少的技能。 這些…

【算法】經典算法題

文章目錄 專題一&#xff1a;雙指針1. 移動零2. 復寫零3. 快樂數4. 盛最多水的容器5. 有效三角形的個數6. 查找總價格為目標值的兩個商品7. 三數之和8. 四數之和 專題二&#xff1a;滑動窗口1. 長度最小的子數組2. 無重復字符的最長字串3. 最大連續1的個數 III4. 將 x 減到 0 的…

云原生技術演進之路-(云技術如何一步步演進的,云原生解決了什么問題?)

云技術如何一步步演進的&#xff1f; 云原生解決了什么問題&#xff1f; 物理設備 電腦剛被發明的時候&#xff0c;還沒有網絡&#xff0c;每個電腦&#xff08;PC&#xff09;&#xff0c;就是一個單機。 這臺單機&#xff0c;包括CPU、內存、硬盤、顯卡等硬件。用戶在單機…

電線電纜、漆包線工廠開源MES/生產管理系統/云MES

萬界星空科技專業的漆包線MES系統功能介紹&#xff1a; 從原材料出入庫-拉絲機等設備管理-漆包線稱重打印系統自動入庫&#xff08;支持多臺秤同時稱重&#xff09;-建立銷售報價、銷售訂單-生產訂單-支持掃碼出庫及自動揀貨出庫-應收應付賬款-對接各種其他系統及財務系統。 …

便攜式水污染物監測設備的招標參數有哪些

便攜式多參數水質檢測儀參數特點&#xff1a; 便攜式多參數水質檢測儀參數特點&#xff1a; 便攜式多參數水質快速測定儀&#xff0c;根據國家檢測標準&#xff08;G B &#xff09; 及環境部檢測標準(H J &#xff09;研發生產&#xff0c;本儀器具有檢測快速、操作簡單、測試…

python3實現類似expect shell的交互式與SFTP的腳本

前面寫過一篇關于python實現類似expect shell的交互式能力的文章&#xff0c;現在補全一下加上sftp的能力腳本。 例子在代碼中__example()方法。 依賴paramiko庫&#xff0c;所以需要執行pip install paramiko來安裝。 import os import queue import re import threading im…

綜合實力盤點高性價比還優質的云服務器:亞馬遜云科技仍然領跑市場

如果說云計算是一條流向數字化未來的河流&#xff0c;那亞馬遜云科技毫無疑問是航行在最前面的帆船&#xff1b;如果說云計算是一條通往數字化未來的鐵軌&#xff0c;那亞馬遜云科技就是行駛在最前面的高鐵。接下來回首往昔&#xff0c;以史為鏡&#xff0c;得出云服務器哪家便…

毛里塔尼亞市場開發攻略,收藏一篇就夠了

毛里塔尼亞是非洲西北部的一個國家&#xff0c;也是中國長期援建的一個國家&#xff0c;也是一帶一路上的國家。毛里塔尼亞生產生活資料依賴進口&#xff0c;長期依賴跟我們國家的貿易關系也是比較緊密的&#xff0c;今天就來給大家介紹一下毛里塔尼亞的市場開發公路。文章略長…

Python監控服務進程及自啟動服務方法與實踐

1. 需求概述 當我們在Windows Server環境中部署XX系統的實際應用中&#xff0c;往往會遇到一些運維管理的挑戰。為了確保系統的持續穩定運行&#xff0c;特別是在服務程序因各種原因突然關閉的情況下&#xff0c;我們可以借助Python的強大生態系統來構建一個監控與自動重啟的管…

分布式鏈路追蹤入門篇-基礎原理與快速應用

為什么需要鏈路追蹤&#xff1f; 我們程序員在日常工作中&#xff0c;最常做事情之一就是修bug了。如果程序只是運行在單機上&#xff0c;我們最常用的方式就是在程序上打日志&#xff0c;然后程序運行的過程中將日志輸出到文件上&#xff0c;然后我們根據日志去推斷程序是哪一…

Comsol Multiphysics 6.2 for Mac建模仿真軟件

COMSOL Multiphysics是一款多物理場仿真軟件&#xff0c;旨在幫助工程師、科學家和研究人員解決各種復雜的工程和科學問題。該軟件使用有限元分析方法&#xff0c;可以模擬和分析多個物理場的相互作用&#xff0c;包括結構力學、熱傳導、電磁場、流體力學和化學反應等。 COMSOL…

一些好用的前端小插件(轉自知乎)

一些好用的前端小插件&#xff08;2&#xff09; 1. cropper.js Cropper.js 2.0 是一系列用于圖像裁剪的 Web 組件。 官網地址&#xff1a;https://fengyuanchen.github.io/cropperjs/v2/zh/ 2. Vditor Vditor是一款瀏覽器端的 Markdown 編輯器&#xff0c;支持所見即所得、…

2024年度投資策略:AI大模型和半導體國產化加速

今天分享的是AI系列深度研究報告&#xff1a;《2024年度投資策略&#xff1a;AI大模型和半導體國產化加速》。 &#xff08;報告出品方&#xff1a;東方證券&#xff09; 報告共計&#xff1a;48頁 前言: 行情回顧與未來展望 電子板塊漲幅轉正&#xff0c;信心逐漸回歸。截至…