VagrantでPHPのプロファイル環境[CentOS7(64bit)+XDebug+XHProf]

注釈

XHProf のプロファイル出力を XHGui で参照する
XHGuigraphvizMongoDB を使用する。
MongoDB は64bit専用。
32bit版しか使用できない場合は、 VagrantでPHPのプロファイル環境[CentOS6(32bit)+XDebug+Webgrind] を参照
有効になるURL
URL パス 概要
http://192.168.33.10/ /var/www/80/ ドキュメントルート(プロファイル対象)
http://192.168.33.10:8080/ /var/www/8080/index.php phpinfo();
http://192.168.33.10:8080/xhgui/webroot/ /var/www/8080/xhgui/webroot/ xhgui

ディレクトリ構成

vagrantディレクトリを用意し、以下のファイルを設置し、 vup.bat を実行する。
vagrant_log www ディレクトリは vup.bat (vagrant up)実行時に自動生成される。

├─vagrant
│  │  mongodb-org-3.0.repo
│  │  provision.sh
│  │  Vagrantfile
│  │  vhosts.conf
│  │  vup.bat
│  │  xhgui.mongo.js
│  │
│  └─.vagrant(自動生成)
│      └─省略
│
├─vagrant_log(自動生成)
│      yyyymmddhhmmss.up.err.log
│      yyyymmddhhmmss.up.out.log
│
└─www(自動生成)
        省略

CentOS7(64bit)+Apache24+PHP56+xdebug+xhprof+xhgui(MongoDB)

Vagrantfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "bento/centos-7.2"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "../www", "/var/www/80", create: true, owner: "vagrant", group: "vagrant", mount_options: ['dmode=777','fmode=755']
  config.vm.provider "virtualbox"
  config.vm.provision :shell, :path => "provision.sh"
  config.ssh.insert_key = false
end

provision.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/sh

### Les RPM de Remi
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
rpm -Uvh remi-release-7*.rpm epel-release-7*.rpm

### Install basic lib
yum install -y vim git graphviz graphviz-gd

### Install MongoDB
cp /vagrant/mongodb-org-3.0.repo /etc/yum.repos.d/mongodb-org-3.0.repo && chown root:root /etc/yum.repos.d/mongodb-org-3.0.repo
yum install -y mongodb-org
systemctl enable mongod.service
systemctl start mongod.service

### Install httpd
yum install -y --enablerepo=remi httpd
mkdir -p /var/www/80 && chown vagrant:apache /var/www/80
mkdir -p /var/www/8080 && chown vagrant:apache /var/www/8080
sed -i -e "s/^Listen 80$/Listen 80\nListen 8080/g" /etc/httpd/conf/httpd.conf
cp /vagrant/vhosts.conf /etc/httpd/conf.d/vhosts.conf && chown vagrant:apache /etc/httpd/conf.d/vhosts.conf

### Install PHP
yum install -y --enablerepo=remi,remi-php56 php php-cli php-common php-devel php-gd php-intl php-mbstring \
php-pear php-xml php-mcrypt php-pdo php-mysqlnd php-mongo php-pecl-xdebug php-pecl-xhprof php-phpunit-PHPUnit
echo 'date.timezone = Asia/Tokyo' >> /etc/php.ini
sed -i -e "s/^error_reporting = E_ALL.*$/error_reporting = E_ALL/g" /etc/php.ini
echo '[XDebug]' >> /etc/php.ini
echo 'xdebug.default_enable = 1' >> /etc/php.ini
echo 'xdebug.remote_autostart = 0' >> /etc/php.ini
echo 'xdebug.remote_connect_back = 1' >> /etc/php.ini
echo 'xdebug.remote_enable = 1' >> /etc/php.ini
echo 'xdebug.remote_handler = dbgp' >> /etc/php.ini
echo 'xdebug.remote_port = 9000' >> /etc/php.ini
#echo 'xdebug.profiler_enable=1' >> /etc/php.ini
#echo 'xdebug.profiler_enable_trigger=1' >> /etc/php.ini
#echo 'xdebug.profiler_output_dir= /tmp' >> /etc/php.ini
echo 'xdebug.max_nesting_level=1000' >> /etc/php.ini
echo 'xdebug.idekey=xdebug.idekey.vagrant' >> /etc/php.ini
echo '<?php phpinfo(); ?>' > /var/www/8080/index.php

### Install PHP:XHGui
wget https://github.com/perftools/xhgui/archive/master.tar.gz && tar xpvf master.tar.gz && mv xhgui-master /var/www/8080/xhgui
chown vagrant:apache /var/www/8080/xhgui && chmod -R 0777 /var/www/8080/xhgui/cache
cp /var/www/8080/xhgui/config/config.default.php /var/www/8080/xhgui/config/config.php
sed -i -e "s/return rand(0, 100) === 42;/return true;/g" /var/www/8080/xhgui/config/config.php
mongo /vagrant/xhgui.mongo.js
cd /var/www/8080/xhgui
php install.php
cd ~

### start httpd
systemctl enable httpd.service
systemctl start httpd.service
#systemctl reload httpd.service

mongodb-org-3.0.repo

1
2
3
4
5
[mongodb-org-3.0]
name=MongoDB Repository
baseurl=http://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.0/x86_64/
gpgcheck=0
enabled=1

vhosts.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<VirtualHost *:80>
  DocumentRoot /var/www/80
  php_admin_value auto_prepend_file "/var/www/8080/xhgui/external/header.php"
  <Directory /var/www/80>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>
<VirtualHost *:8080>
  DocumentRoot /var/www/8080
  <Directory /var/www/8080>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

xhgui.mongo.js

1
2
3
4
5
6
var conn = new Mongo(), db = conn.getDB('xhprof');
db.results.ensureIndex({'meta.SERVER.REQUEST_TIME':-1});
db.results.ensureIndex({'profile.main().wt':-1});
db.results.ensureIndex({'profile.main().mu':-1});
db.results.ensureIndex({'profile.main().cpu':-1});
db.results.ensureIndex({'meta.url':1});