xhprof擴展安裝與使用

来源:https://www.cnblogs.com/renzhicai/archive/2018/08/27/9545614.html
-Advertisement-
Play Games

[TOC] 一、xhprof擴展安裝步驟 xhprof是PHP的一個擴展,廢話不多說,直奔正題。 1、安裝 PHP5版本的安裝 PHP7版本的安裝 下載源碼包 "xhprof" :https://github.com/rustjason/xhprof/tree/php7 2、修改php.ini配置文 ...


目錄

一、xhprof擴展安裝步驟

xhprof是PHP的一個擴展,最好也直接安裝上graphviz圖形繪製工具(用於xhprof分析結果以直觀的圖形方式顯示),廢話不多說,直奔正題。

1、安裝

  • PHP5版本的安裝
wget http://pecl.php.net/get/xhprof-0.9.4.tgz
tar -zxvf xhprof-0.9.4.tgz 
cd xhprof-0.9.4
cd extension/
phpize
./configure
make
make install
unzip xhprof-php7.zip 
cd xhprof-php7/extension/
phpize 
./configure --with-php-config=/usr/local/php/bin/php-config 
make
make install

2、修改php.ini配置文件

在php.ini配置文件中追加下麵配置,並創建目錄/home/wwwroot/default/xhprof_data

[xhprof]
extension = xhprof.so
// xhprof分析結果文件存放根目錄
xhprof.output_dir = /home/wwwroot/default/xhprof_data

3、添加一個環境變數XHPROF_ROOT_PATH

為了後期每個項目都能使用xhprof來進行性能分析,建議給PHP加一個環境變數,這樣之後,在任何項目代碼里都可以很方便的調用xhprof來分析性能瓶頸,請執行如下操作:

vim /usr/local/php/etc/php-fpm.conf
env[XHPROF_ROOT_PATH]=/usr/local/php/include/xhprof/

4、將xhprof核心源代碼複製到上述XHPROF_ROOT_PATH環境變數所指定的目錄下

cp -r xhprof_lib /usr/local/php/include/xhprof/xhprof_lib

5、將下麵兩個目錄複製到xhprof_data的同級目錄下(最好都放到web根目錄下)

查看分析結果文件有用

//執行
cp -r xhprof_html /home/wwwroot/default/xhprof_html
cp -r xhprof_lib /home/wwwroot/default/xhprof_lib

//改變xhprof_data目錄擁有者,為了瀏覽器訪問時能在xhprof_data目錄下寫入文件
chown -R www:www xhprof_data

6、訪問xhprof根目錄

配置demo.com功能變數名稱根目錄為/home/wwwroot/default/,則可訪問如下鏈接查看xhprof結果分析根目錄http://demo.com/xhprof_data/,如下圖所示:

7、形象化的查看分析結果

安裝圖形繪製工具,後面的分析結果可以通過該工具以圖形顯示,更直觀
執行安裝命令:yum install graphviz

二、xhprof的使用

1、xhprof性能分析小demo

下麵寫的三種方式實現階乘的代碼

<?php

xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);

$n = 5;

echo jc($n);
echo '<br>';

echo jc($n);
echo '<br>';

echo jc($n);
echo '<br>';

function jc($n){
    if($n == 1){
        return 1;
    }
    
    return $n * jc($n-1);
}

function jc2($n){
    $m = 1;
    for($i=1; $i<=$n; $i++){
        $m = $m * $i;
    }
    
    return $m;
}

function jc3($n){
    $arr = [];
    $arr[1] = 1;
    
    for($i = 2; $i<=$n; $i++){
        $arr[$i] = $i * $arr[$i-1];
    }
    
    return $arr[$n];
}


$data = xhprof_disable();
//$_SERVER['XHPROF_ROOT_PATH'] 這就是第三步添加的那個環境變數
include_once $_SERVER['XHPROF_ROOT_PATH'] . "xhprof_lib/utils/xhprof_lib.php";
include_once $_SERVER['XHPROF_ROOT_PATH'] . "xhprof_lib/utils/xhprof_runs.php";
$x = new XHProfRuns_Default();

//拼接文件名
$xhprofFilename = date('Ymd_His');

//print_r($data);die;//此處的列印數據看起來非常不直觀,所以需要安裝yum install graphviz 圖形化界面顯示,更直觀
$x->save_run($data, $xhprofFilename);

上述小demo執行後,會在xhprof_data目錄下生成一個分析結果保存文件,網頁端訪問結果文件,如下圖:

當我在點[View Full Callgraph]查看圖形分析界面時,問題出現了,如下圖:

好在網上查到原因是,php配置文件中有個disable_functions禁用函數列表,把裡面的proc_open去掉即可。

圖形分析結果顯示如下

2、實際項目中該如何引入xhprof

請參考如下截圖所示引入思路(在項目控制器基類構造方法和析構方法里做手腳),思路技巧僅供學習參考,如下圖:


下麵是我在項目(以Yii2為框架)下引入xhprof代碼一覽

<?php
namespace backend\component;

use Yii;
use common\component\baseController;

class backendBaseController extends baseController
{
    public $layout = "/content";
    public $enableCsrfValidation = false;

    public static $profiling = 0;

    public function init(){
        parent::init();
        
        self::$profiling = 1;// !(mt_rand() % 9);
        if  (self::$profiling) {
            xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
        }
    }

    public function __destruct()
    {
        if(self::$profiling){
            $data = xhprof_disable();
            //$_SERVER['XHPROF_ROOT_PATH'] 該環境變數由第3步得來
            include_once $_SERVER['XHPROF_ROOT_PATH'] . "/xhprof_lib/utils/xhprof_lib.php";
            include_once $_SERVER['XHPROF_ROOT_PATH'] . "/xhprof_lib/utils/xhprof_runs.php";
            $x = new XHProfRuns_Default();

            //當前路由
            $routeName = Yii::$app->requestedRoute;
            //路由為空,則說明是首頁
            if (empty($routeName)){
                $routeName = Yii::$app->defaultRoute;
            }

            //拼接xhprof分析結果保存文件名
            $xhprofFilename = str_replace('/', '_', $routeName).'_'.date('Ymd_His');
            $x->save_run($data, $xhprofFilename);
        }
    }
}

總結

xhprof是一個分析PHP代碼性能瓶頸,提高PHP代碼效率的有利工具,通過xhprof,可以看到代碼慢在哪裡,哪裡還有優化的空間等等。

最後分享一個關於xhprof不錯的資料 ipc2015-xhprof.pdf 下載鏈接:https://pan.baidu.com/s/1EPuKunXlI1gvmtLICHyCxw 密碼:11p0

參考資料

1.使用XHProf查找PHP性能瓶頸

2.PHP性能分析工具 xhprof

3.xhprof安裝了graphviz還報錯failed to execute cmd " dot -Tpng"


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在本篇文章中,讓我們看看什麼是DevOps,為什麼它如此重要! 我們將首先跟蹤導致DevOps的軟體開發方法的演變,然後探索什麼是DevOps及其生命周期,並通過評估世界頂級公司如何使用DevOps來獲得益處。 ...
  • 題意 給出$n$個矩形,找出一個點,使得至少在$n$個矩陣內 Sol 呵呵噠,昨天cf半夜場,一道全場切的題,我沒做出來。。不想找什麼理由,不會做就是不會做。。 一個很顯然的性質,如果存在一個點 / 矩形在$n - 1$個矩形內的話 它們的交集不會是空集。 然後我們去枚舉每個點,假設他不與$(n - ...
  • 1、Object 2、String 3、StringBuilder ...
  • 一、匿名函數 什麼匿名是函數: 不需要使用def函數名的函數或者子程式 函數語法: lambda 參數:表達式 函數特點: 1、lamdba只是一個表達式,省去定義函數過程,讓代碼更精簡 2、lamdba 在表達式中封裝的邏輯有限 3、不能訪問自己參數序列外或者全局命名空間的參數 舉例: 二、內建m ...
  • c/c++ 模板與STL小例子系列 自建Array數組 自建的Array數組,提供如下對外介面 | 方法 | 功能描述 | | | | | Array() | 無參數構造方法,構造元素個數為模板參數個的數組 | | Array(int length) | 有參數構造方法,構造元素個數為參數lengt ...
  • 對 Excel 進行讀寫操作是生產環境下常見的業務,網上搜索的實現方式都是基於POI和JXL第三方框架,但都不是很全面。小編由於這兩天剛好需要用到,於是就參考手寫了一個封裝操作工具,基本涵蓋了Excel表(分有表頭和無表頭)的創建,並對它們進行讀寫操作。為方便大家,有需要者可以點擊文後點解下載直接使 ...
  • 使用未封裝的方法連接資料庫 步驟: 一、確定連接方式(以SqlServer為例): ①Windows身份驗證。 ②SQLServer身份驗證方式(需要用戶名和密碼),資料庫用戶名和密碼每個人的都不同。 二、連接資料庫(SqlConnection) SqlConnection 表示到 SQL Serv ...
  • 一、下載: 中科大鏡像:http://mirrors.ustc.edu.cn/anaconda/archive/ 清華鏡像:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 二、安裝: 預設就行,安裝路徑最好換一下 三、配置環境變數: 控制 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...