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

[前回](http://qiita.com/ttsan/items/6816772143cf2ddacef5)、xhprofをインストールしたが
さらに調べてみたら、XHGUIというものがあるとのこと。
下記のサイトを参考にXHGUIをインストールし、Callgraphも一緒にインストールしてみようと思う。
[PHPの遅い処理を解析するためにEC2にXHProf導入してみた](http://chobi.hatenablog.jp/entry/2013/06/20/005816)

#環境

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については[こちら](http://jp.php.net/manual/ja/ini.core.php#ini.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
```

```lang: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](https://qiita-image-store.s3.amazonaws.com/0/37644/398688df-5cd1-0982-0b17-f8e963cd6a16.jpeg)


#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](https://qiita-image-store.s3.amazonaws.com/0/37644/05deb241-67c7-0d63-9531-6d5626ba1923.jpeg)

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

![graph_p.jpg](https://qiita-image-store.s3.amazonaws.com/0/37644/42bd40dd-b7da-b82e-1d47-4fa0915cb992.jpeg)