[VCCW2.x] XHGUIをインストールする

[XHProfをインストール](https://qiita.com/heikyo/items/f7280d727ab85482bfcc)したので、
今回はXHProfのプロファイリング結果を可視化するXHGUIをインストールしたいと思います。

## 環境
| CentOS | 6.7 |
|:-:|:-:|
| PHP | 5.4.45  |
| VCCW | 2.21 |

## XHGUIのインストール
### githubからソースコードをダウンロード(vagrant内)
githubからソースコードをダウンロードして、wordpressディレクトリに置きます。

```
$ vagrant ssh
$ cd /usr/local/src
$ sudo wget https://github.com/preinheimer/xhprof/archive/master.zip
$ sudo unzip master.zip
$ cp -r /usr/local/src/xhprof-master /vagrant/www/wordpress/xhgui
```

### wordpress.confの編集(vagrant内)
VCCWではwordpressの公開ディレクトリに関する設定は
/etc/httpd/sites-available/wordpress.confに記述されています。
wordpress.confに「php_admin_value auto_prepend_file "/var/www/wordpress/xhgui/external/header.php"」
を追加します。

```/etc/httpd/sites-available/wordpress.conf
<VirtualHost *:80>
  ServerName test.example
  DocumentRoot /var/www/wordpress
+ php_admin_value auto_prepend_file "/var/www/wordpress/xhgui/external/header.php"
</VirtualHost>
```

### xhgui/external/header.phpの編集

```php:xhgui/external/header.php
//Determine wether or not to profile this URL randomly
- if ($_xhprof['doprofile'] === false)
+ 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;
-    } 
}
```

### データベースの作成(vagrant内)
データベースを作成します。
VCCWではwordpress用に作成されたユーザーではデータベースを作成できないので、
rootユーザーで作成します。　パスワードは「wordpress」でいけると思います。

```
$ mysql -u root -p
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;
```

### configファイルの作成
サンプルのコンフィグファイルをコピーします。

```
$ cd [DocumentRoot]/xhgui/xhprof_lib/ 
$ cp config.sample.php config.php 
$ vi config.php
```

こちらはご自身の環境に合わせてください。

```php:[DocumentRoot]/xhgui/xhprof_lib/config.php
$_xhprof['dbtype'] = 'mysql';
$_xhprof['dbhost'] = 'localhost';
$_xhprof['dbuser'] = 'root';
$_xhprof['dbpass'] = 'wordpress';
$_xhprof['dbname'] = 'xhprof';
$_xhprof['dbadapter'] = 'Mysql';
$_xhprof['servername'] = 'myserver';
$_xhprof['namespace'] = 'myapp';
$_xhprof['url'] = 'http://test.example/xhgui/xhprof_html';
```

### httpdの再起動

```
$ sudo service httpd restart
```


## [エラー] You do not have permission to view this page.　
ブラウザで確認したところ
http://test.example/xhgui/xhprof_html/index.php
「You do not have permission to view this page.」というエラーが出ました。

### [対処法] IPアドレスの許可
vagrantを作成する際に指定したIPアドレスを許可するか
`$controlIPs = false`にしてしまえば、対処できます。
VCCWの場合は、default.ymlまたはsite.ymlでIPアドレスを指定しているかと思います。
デフォルトは「192.168.33.10」だったかと思います。

```php:[DocumentRoot]/xhgui/xhprof_lib/config.php
//Control IPs allow you to specify which IPs will be permitted to control when profiling is on or off within your application, and view the results via the UI.
// $controlIPs = false; //Disables access controlls completely.
$controlIPs = array();
$controlIPs[] = "127.0.0.1";   // localhost, you'll want to add your own ip here
$controlIPs[] = "::1";         // localhost IP v6
+ $controlIPs[] = "192.168.33.10";
```

## 確認
ブラウザで確認します。
http://test.example/xhgui/xhprof_html/index.php

![xhgui](https://qiita-image-store.s3.amazonaws.com/0/10263/fe57cfbd-de03-e4df-8510-9abec71db708.png)


## 参考
[xhprofを使ってみた(XHGUIとCallgraphインストール編）](https://qiita.com/ttsan/items/e26e2dc1394714d13a58)
[Php/速度改善/XHGui - 初心者エンジニアの簡易メモ](http://wiki.nonip.net/index.php/Php/%E9%80%9F%E5%BA%A6%E6%94%B9%E5%96%84/XHGui)