ホームページ  >  記事  >  バックエンド開発  >  xhprof を使用して php7 で php のパフォーマンスをテストするにはどうすればよいですか? (手法の紹介)

xhprof を使用して php7 で php のパフォーマンスをテストするにはどうすればよいですか? (手法の紹介)

青灯夜游
青灯夜游転載
2020-07-15 17:11:474571ブラウズ

xhprof を使用して php7 で php のパフォーマンスをテストするにはどうすればよいですか? (手法の紹介)

#はじめに

1 背景

  • PHP の xhprof 拡張機能 Facebook は、Facebook が HHVM を完全に使用し、PHP zend エンジンを使用しなくなったため、更新および保守されなくなります。

  • xhprof は、新しいバージョンの PHP (PHP7) をサポートしていません。Tideways 拡張機能は、xhprof プロジェクト フォークから維持されており、現在、PHP 7.2、7.1、7.0、5.6、および 5.5 をサポートしています。

  • tideways はオープンソース プロジェクトです。課金されるのは UI サービスのみです。実際、xhgui は私たちの日常のニーズを完全に満たすことができます。

2 Function

Tideways は、PHP のパフォーマンスをテストするために使用される拡張機能で、PHP の実行プロセス全体で呼び出される関数、関数呼び出し数、実行時間、 CPU 時間、メモリ使用量、メモリ ピーク、合計実行時間、合計 CPU 時間、合計メモリ使用量、合計メモリ ピークおよびその他のデータ、上記のデータを分析して PHP のパフォーマンスのボトルネックを特定、PHP 実行プロセスの分析など。

3 利点

  • tideways は、xhgui と組み合わされた PHP 拡張機能であるため、埋め込む必要はありません。 PHP コード モニタリング コード

  • リクエストごとに実行ログを生成せずに実行頻度 (たとえば、1/100) を設定すると、パフォーマンスが低下します。また、実行頻度をアクティブに制御することもできます。制御するパラメータをリクエストすることで実行ログを生成します (debug=1)

  • データを変換するためのシンプルで直接的な UI があります

  • 次のことができます特定のインターフェースを分析したり、一定期間のインターフェースのリクエスト状況を分析したりするなど、データのフィルタリングの条件を自由に合わせることができます。

  • ## 非侵入的ではありますが、インターフェイスごとに実行ログが生成される場合、CPU とメモリの消費は無視できません。

5 実装原則

tideways 拡張機能は実行ログの生成を担当します

nginx では、fastcgi_param を設定することで実行されます。 PHP_VALUE auto_prepend_file, auto_prepend_fileで設定されたPHPファイルをリクエスト開始前に実行します ファイル内ではregister_shutdown_functionメソッドが使用されます PHPプロセスの最後に、潮汐路の埋め込みを実現するためにtideways_disableが呼び出され、実行ログがmongodbに保存されますmysqlやファイルをxhguiで解析して表示し、表示形式には棒グラフ、ウォーターフォールフロー、フレームチャートなどがあります。

    アプリケーション
  • 次に、
Intrusive

Non- の 2 つのアプリケーション方法を紹介します。侵入型 侵入型はコードにコードを追加することを指し、侵入型はデフォルトの UI を使用します。

非侵入型は、何も変更せずにコードを追加することを指します。 xhgui を非侵襲的に使用して、nginx/Apache を変更してコード インジェクションを実装します。インストールtideways_xhprof

git clone "https://github.com/tideways/php-xhprof-extension.git"
cd php-xhprof-extension
phpize
./configure --with-php-config=/usr/local/php7/bin/php-config
make
sudo make install

php.ini に extension=tideways_xhprof.so# を追加します。

##非侵入型:

<?php
tideways_xhprof_enable();

// your application code

$data = tideways_xhprof_disable();
file_put_contents(
    sys_get_temp_dir() . "/" . uniqid() . ".yourapp.xhprof",
    serialize($data)
);

  // $data = tideways_xhprof_disable();
  // file_put_contents(
  //     sys_get_temp_dir() . "/" . date(&#39;His&#39;, time()) . ".material.xhprof",
  //     serialize($data)
  // );

ここで生成された .xhprof ファイルは tmp ディレクトリにあります。デフォルトの UI では、次の場所でも .xhprof が検索されます。ファイル

データを検索するために使用されるデフォルトの UI をインストールします

git clone git@github.com:phacility/xhprof.git

xhprof_lib

および

このリポジトリ xhprof_html ディレクトリを Web フォルダーに移動し、xhprof_html/index.php に移動してトレース リストを表示します。

関数呼び出しのメモを表示したい場合は、Callgraph をインストールする必要があります

Callgraph のインストール

Callgraph は実際には3つのツールの組み合わせになります。

1 つは C の関数呼び出しツリーを生成するために使用される cflow または calltree で、以下では cflow を中心に紹介します。

graphviz によって強化された、ドット テキスト グラフィックス言語を処理するためのツール。 C 関数呼び出しツリーをドット形式に変換するためのスクリプト:tree2dotx

Ubuntu を例として、それらを個別にインストールします:

sudo apt-get install cflow graphviz

次に、tree2dotx と Callgraph をインストールします。デフォルトでは /usr/local/bin にインストールされます。

wget -c https://github.com/tinyclub/linux-0.11-lab/raw/master/tools/tree2dotx
wget -c https://github.com/tinyclub/linux-0.11-lab/raw/master/tools/callgraph
sudo cp tree2dotx callgraph /usr/local/bin
sudo chmod +x /usr/local/bin/{tree2dotx,callgraph}

次の 2 つのレンダリングが表示されます:

侵入的:

# xhgui の侵入的な使用には mongodb が必要です

xhgui のインストール

git clone git@github.com:perftools/xhgui.git

Nginx の構成

server {
  listen 80;
  server_name site.localhost;
  root /Users/markstory/Sites/awesome-thing/app/webroot/;
  fastcgi_param PHP_VALUE "auto_prepend_file=/home/www/xhgui/external/header.php";  #这里依据个人目录而配
}
これが意味するのは、非侵入的な検出パフォーマンスの目的を達成するために、プロジェクトの PHP コードを実行する前に header.php を実行することです

xhgui 設定 (頻度ログ生成の数)xhgui の config/config.default.php で、サンプリング ヒット数を設定できます;

return rand(1, 100) === 42; 为1%的采样率,改成return True;则标识每次都采样

&#39;profiler.enable&#39; => function() {
   // url 中包含debug=1则百分百捕获
   if(!empty($_GET['debug'])){
       return True;
   }else{
       // 1%采样
       return rand(1, 100) === 42;
   }
}

mongodb的配置

   xhgui/config/config.default.php

// Can be either mongodb or file.
   /*
   'save.handler' => 'file',
   'save.handler.filename' => dirname(__DIR__) . '/cache/' . 'xhgui.data.' . microtime(true) . '_' . substr(md5($url), 0, 6),
   */
   'save.handler' => 'mongodb',
   // Needed for file save handler. Beware of file locking. You can adujst this file path
   // to reduce locking problems (eg uniqid, time ...)
   //'save.handler.filename' => __DIR__.'/../data/xhgui_'.date('Ymd').'.dat',
   'db.host' => 'mongodb://127.0.0.1:27017',
   'db.db' => 'xhprof',

mongo服务器的配置

mongo
 > use xhprof
 > db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
 > db.results.ensureIndex( { 'profile.main().wt' : -1 } )
 > db.results.ensureIndex( { 'profile.main().mu' : -1 } )
 > db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
 > db.results.ensureIndex( { 'meta.url' : 1 } )

最后展示几张xhgui的效果图

 

 

 

 相关学习推荐:PHP编程从入门到精通

以上がxhprof を使用して php7 で php のパフォーマンスをテストするにはどうすればよいですか? (手法の紹介)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。