# xhprof

http://php.net/manual/ja/book.xhprof.php

XHProf は、軽量で階層型な命令ベースのプロファイラです。 データ収集フェーズでは、呼び出し回数や プログラムの動的コールグラフ内の弧の包括的メトリクスを追跡します。 排他的メトリクス (実行時間や CPU 時間、メモリ使用量など) の計算は、レポーティングや後処理のフェーズで行います。 関数のプロファイルは、呼び出す側と呼び出される側に分けることができます。 XHProf が再帰関数を扱うときには、コールグラフ内での循環をデータ収集時に検出し、 循環を回避するために、再帰の実行のたびにその深さも含めた一意な名前をつけます。

## Install

### xhprof

  # pecl search xhprof
  Retrieving data...0%
  Matched packages, channel pecl.php.net:
  =======================================
  Package Stable/(Latest) Local
  xhprof  0.9.4 (beta)          XHProf: A Hierarchical Profiler for PHP
  # pecl install xhprof-0.9.4
  downloading xhprof-0.9.4.tgz ...
  Starting to download xhprof-0.9.4.tgz (842,077 bytes)
  ~省略~
  Build process completed successfully
  Installing '/usr/lib64/php/modules/xhprof.so'
  install ok: channel://pecl.php.net/xhprof-0.9.4
  configuration option "php_ini" is not set to php.ini location
  You should add "extension=xhprof.so" to php.ini
  # echo "extension=xhprof.so" > /etc/php.d/xhprof.ini

# xhgui

https://github.com/perftools/xhgui

A graphical interface for XHProf data built on MongoDB.

This tool requires that XHProf or its one of its forks Uprofiler, Tideways are installed. XHProf is a PHP Extension that records and provides profiling data. XHGui (this tool) takes that information, saves it in MongoDB, and provides a convenient GUI for working with it.

## Install

### php-mcrypt

xhguiと同時にインストールされるslim(http://www.slimframework.com/)に必要。

  # yum --enablerepo=remi,remi-php56 install php-mcrypt

### MongoDB Extension

  # yum install openssl-devel
  # pecl install mongodb
  ~省略~
  Build process completed successfully
  Installing '/usr/lib64/php/modules/mongodb.so'
  install ok: channel://pecl.php.net/mongodb-1.1.7
  configuration option "php_ini" is not set to php.ini location
  You should add "extension=mongodb.so" to php.ini
  # echo "extension=mongodb.so" > /etc/php.d/mongodb.ini

### xhgui

ブラウザからアクセスして結果を確認するので、ブラウザからアクセスできる場所、または、
シンボリックリンクでアクセス可能な場所などに設置する。

  # cd /var/www
  # git clone https://github.com/perftools/xhgui.git
  # cd xhgui
  # chmod -R 0777 cache
  # php install.php
  Downloading composer.
  Downloading 1.1.2...
  ~省略~
  Installing dependencies.
  ~省略~
  Checking permissions for cache directory.
  Permissions on cache/ are ok.

## Configuration

### apache

すべてのPHPの処理前にプロファイラが実行されるようにする。

  # cp -a /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bk
  # vi /etc/httpd/conf/httpd.conf
  DocumentRoot "/var/www/ebi-api/current/web"
  SetEnv APP_ENV development
  +) php_admin_value auto_prepend_file "/var/www/xhgui/external/header.php"
  <Directory />
  # /etc/rc.d/init.d/httpd restart
  httpd を停止中:                                            [  OK  ]
  httpd を起動中:                                            [  OK  ]

### xhgui

(出力先mongodb前提で)mongodbのサーバ、ポートを指定する。
(内向きツールや画像など)特定URIにアクセスしたときはプロファイルしない設定を追加する。

  # cd /var/www
  # cp -a ./xhgui/config/config.default.php ./xhgui/config/config.default.php.bk
  # vi ./xhgui/config/config.default.php
  19c19
  <     'db.host' => 'mongodb://adm01:27017',
  >     'db.host' => 'mongodb://127.0.0.1:27017',
  33,36d32
  <         if (strpos($_SERVER['REQUEST_URI'], 'xhgui')) return false;
  <         if (strpos($_SERVER['REQUEST_URI'], 'apc')) return false;
  <         if (strpos($_SERVER['REQUEST_URI'], 'favicon')) return false;
  <