xhprof
XHGUI
Callgraph

xhprofを使ってみた(XHGUIとCallgraphインストール編)

More than 3 years have passed since last update.

前回、xhprofをインストールしたが
さらに調べてみたら、XHGUIというものがあるとのこと。
下記のサイトを参考にXHGUIをインストールし、Callgraphも一緒にインストールしてみようと思う。
PHPの遅い処理を解析するためにEC2にXHProf導入してみた

環境

CentOS 6.5
PHP 5.5.15

1.XHGUIインストール

1.XHGUIをダウンロードして、[DocumentRoot]配下にコピー。

# cd /usr/local/src
# wget https://github.com/preinheimer/xhprof/archive/master.zip
# unzip master.zip
# mkdir [DocumentRoot]/xhgui
# chown [apache実行ユーザー] [DocumentRoot]/xhgui
# cp -r xhgui-master/* [DocumentRoot]/xhgui/

2.httpd.confの設定

全てのPHPの処理前に「"[DocumentRoot]/xhgui/external/header.php"」が実行される様にするため
httpd.confに
「php_admin_value auto_prepend_file "[DocumentRoot]/xhgui/external/header.php"」
を下記のように追加

# vi httpd.conf
httpd.conf
<VirtualHost *:80>
  ServerName nandakana.com
  DocumentRoot [DocumentRoot]
  php_admin_value auto_prepend_file "[DocumentRoot]/xhgui/external/header.php"
</VirtualHost>

auto_prepend_fileについてはこちら

4.[DocumentRoot]/xhgui/external/header.phpを編集する。

header.phpを編集し、xhprofでプロファイリングできるようにする。
また、XHGUIへのアクセスがプロファイリングされないようにする。

header.php
//Determine wether or not to profile this URL randomly
if ($_xhprof['doprofile'] === false)
{
    //Profile weighting, one in one hundred requests will be profiled without being specifically requested
    if (rand(1, $weight) == 1)
    {
        $_xhprof['doprofile'] = true;
        $_xhprof['type'] = 0;
    } 
}

↓変更

header.php
//Determine wether or not to profile this URL randomly
if (! strpos($_SERVER['REQUEST_URI'], 'xhprof_html') && $_xhprof['doprofile'] === false)
{
    //Profile weighting, one in one hundred requests will be profiled without being specifically requested
//    if (rand(1, $weight) == 1)
//    {
        $_xhprof['doprofile'] = true;
        $_xhprof['type'] = 0;
//    } 
}

4.プロファイル格納DBへの接続設定

config.phpを編集する

# cd [DocumentRoot]/xhgui/xhprof_lib/ 
# cp config.sample.php config.php 
# vi config.php
config.php
$_xhprof['dbtype'] = 'mysql'; // Only relevant for PDO 
$_xhprof['dbhost'] = 'localhost';                       # ←環境に応じて変更
$_xhprof['dbuser'] = 'root';                            # ←環境に応じて変更
$_xhprof['dbpass'] = 'password';                        # ←環境に応じて変更
$_xhprof['dbname'] = 'xhprof'; 
$_xhprof['dbadapter'] = 'Mysql';                        
$_xhprof['servername'] = 'myserver';                     
$_xhprof['namespace'] = 'myapp';                        
$_xhprof['url'] = 'http://[domain]/xhgui/xhprof_html';  # ←環境に応じて変更

5.DBの設定

DBに接続し、DB「xhprof」を作成し
[DocumentRoot]/xhgui/xhprof_lib/utils/Db/Pdo.phpに記載されているCREATE TABLEクエリを実行して
テーブルを作成する。

mysql > create database xhprof;
mysql >  CREATE TABLE `details` (
 `id` char(17) NOT NULL,
 `url` varchar(255) default NULL,
 `c_url` varchar(255) default NULL,
 `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
 `server name` varchar(64) default NULL,
 `perfdata` MEDIUMBLOB,
 `type` tinyint(4) default NULL,
 `cookie` BLOB,
 `post` BLOB,
 `get` BLOB,
 `pmu` int(11) unsigned default NULL,
 `wt` int(11) unsigned default NULL,
 `cpu` int(11) unsigned default NULL,
 `server_id` char(3) NOT NULL default 't11',
 `aggregateCalls_include` varchar(255) DEFAULT NULL,
 PRIMARY KEY  (`id`),
 KEY `url` (`url`),
 KEY `c_url` (`c_url`),
 KEY `cpu` (`cpu`),
 KEY `wt` (`wt`),
 KEY `pmu` (`pmu`),
 KEY `timestamp` (`timestamp`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

6.XHGUIにアクセスして、画像のようなページが表示されたらOK。

http://(domain)/xhgui/xhprof_html/index.php

XHGUI.jpg

2.Callgraphのインストール

1.yumでgraphviz graphviz-gdをインストール

# yum -y install graphviz graphviz-gd

2.config.phpを編集する。

# vi [DocumentRoot]/xhgui/xhprof_lib/config.php
config.php
$_xhprof['dot_binary']  = '/usr/bin/dot'; 
$_xhprof['dot_tempdir'] = '/tmp'; 
$_xhprof['dot_errfile'] = '/tmp/xh_dot.err';

3.各プロファイル画面にあるリンク「View Callgraph」をクリックして

graph.jpg

下記のような画面が表示されたらOK

graph_p.jpg