今回、作成したPHPプログラムのどこにボトルネックがあるかを調べるために
XHProf
XH GUI
CallGraph(Graphviz)
のプロファイル環境を構築しました。
以下、インストール時のメモです。
1. xhprofのインストール
xhprofは、peclで公開されているため、peclを使ってインストールします。
# pecl install xhprof-0.9.4
xhprofを読み込むため、xhprof.iniの作成とシンボリックリンクの作成を行います。
# vi /etc/php5/mods-available/xhprof.ini
ファイルの中身は以下の1行のみです。
extension=xhprof.so
xhprof.iniを有効にするため、以下の作業を行います。
# cd /etc/php5/fpm/conf.d
# ln -s ../../mods-available/xhprof.ini 30-xhprof.ini
# systemctl restart php5-fpm
2. XH GUIのダウンロードと配置
XH GUIはgitにて公開されています。gitコマンドを使ってcloneします。
cloneしたファイル一式を/opt/xhprof として配置します。
# cd /usr/local/src
# git clone https://github.com/preinheimer/xhprof.git
# mv xhprof /opt/xhprof
3. Graphvizのインストール
これは、debパッケージが普通に提供されているため、apt-getでインストールします。
# apt-get install graphviz
4. XH GUIとCallGraphの設定準備 XH GUIの設定ファイルを準備します。
# cd /opt/xhprof/xhprof_lib
# cp config.sample.php config.php
バックエンドにMySQLを利用。及び、Graphvizの設定を行います。
MySQLへの接続は、mysqliを利用します。
今回は、DBサーバーが別サーバーのため、mysqlサーバーへユーザーの追加も行います。
# ssh db1
*db1は、任意のサーバーを選択してください。
ローカルのmysqlを利用するときは、この行を無視してください。
# mysql -uroot -p****
mysql> create database xhprof;
mysql> grant all on xhprof.* to xhprof@'192.168.0.0/255.255.255.0' identified by 'xhprof';
mysql> flush privileges;
mysql> quit
# exit
青色の箇所は、お使いの環境によって変更してください。
たとえば、MySQLがローカルで動いていれば、localhost ですね。
5. XH GUI用のSQLを流し込み XH GUIに、MySQL用のcreate table文が入っているため、これを利用します。
# cd /opt/xhprof/xhprof_lib/utils/Db
# cat Mysqli.php
※ファイルの先頭にcreate table文がはいっているので、コピーしておく
# ssh db1
# mysql -xhprof -pxhprof -A xhprof -h 192.168.0.10
mysql> ... ここにcreate table文を貼り付け
mysql> exit
# exit
6. XH GUIの設定ファイル編集
# cd /opt/xhprof/xhprof_lib/
# vi config.php
以下では、実際に行った設定内容を記述します。(一部伏せてます)
・5 行目付近 sec.5で行ったDB設定を反映
$_xhprof['dbtype'] = 'mysql'; // Only relevant for PDO
$_xhprof['dbhost'] = '192.168.0.10';
$_xhprof['dbuser'] = 'xhprof';
$_xhprof['dbpass'] = 'xhprof';
$_xhprof['dbname'] = 'xhprof';
$_xhprof['dbadapter'] = 'Mysqli';
$_xhprof['servername'] = 'myserver';
$_xhprof['namespace'] = 'myapp';
$_xhprof['url'] = 'http://xhprof.example.com'; // <- nginxで設定するURLを指定。 sec.7を参照
・31行目付近(コメントアウトを外す)
$_xhprof['dot_binary'] = '/usr/bin/dot';
$_xhprof['dot_tempdir'] = '/tmp';
$_xhprof['dot_errfile'] = '/tmp/xh_dot.err';
・52行目付近 アクセスコントロールを無効にする
$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
7. XH GUIの公開
以下はnginxの設定例です。
# cd /etc/nginx/conf.v/
# vi xhprof.example.com.conf
server {
listen 80;
server_name xhprof.example.com;
root /opt/xhprof/xhprof_html/;
index index.php index.html index.htm;
charset utf-8;
location = /robots.txt { access_log off; log_not_found off; }
location = /favicon.ico { access_log off; log_not_found off; }
location ~* \.php$ {
expires off;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
8. xhprofを有効にする
xhprofを有効にするドメインのfcgiパラメータを編集します。
# vi dev.example.com.conf
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
...
fastcgi_param PHP_VALUE
"auto_prepend_file=/opt/xhprof/external/header.php \n
auto_append_file=/opt/xhprof/external/footer.php"; // 以上3行を追加する
}
9. nginxの設定確認
# /etc/init.d/nginx configtest
10. nginx再起動
# systemctl restart nginx
11. sec.8で有効にしたドメインへ、特殊パラメータをつけてアクセス
http://dev.example.com/?_profile=1
一度profile=1をつけると、cookieにprofileのフラグが立つため、無効にする場合は
http://dev.example.coim/?_profile=0
とアクセスする。
12. xhprof及びXH GUI, Graphvizが動作していることを確認
http://xhprof.example.com/ へアクセスし、XH GUIが動作していることを確認
コメント