PHPで開発していると、このページ重いなあ…インフラスケールアップするか?いやいやそんなCPU使用料使ってないし、もしかしたらこのPHPプログラムに原因があるのでは?など、どのメソッドが重くなっているかリファクタリングすることでボトルネックを探しやすくしてくれて、さらに可視化してくれるxhprof、xhgui、graphvizを導入してみました。しかもFacebook製とな!
■Environment
・EC2 Amazon Linux t2.micro
・RDS Aurora
・PHP 5/7
・Apache 2.2.34
■xhprof install
・php-devel install
1 |
$ sudo yum install php-devel |
・xhprof-0.9.4 install
1 2 3 4 5 6 7 |
$ sudo pecl install channel://pecl.php.net/xhprof-0.9.4 ~省略~ 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 |
・edit php.ini
1 2 3 4 5 |
$ sudo vim /etc/php.ini #一番下に追記 [xhprof] extension=xhprof.so xhprof.output_dir="/var/log/xhprof/" |
・make log
1 2 |
$ sudo mkdir /var/log/xhprof $ sudo chmod 777 /var/log/xhprof |
・確認
1 2 3 4 5 6 |
# php --ri xhprof xhprof xhprof => 0.9.2 CPU num => 1 |
OK!
■xhgui install
https://github.com/pierrejoye/xhprof-pr
・git clone
1 2 3 |
# sudo su - adachin $ mkdir htdocs $ git clone https://github.com/pierrejoye/xhprof-pr.git |
・header.php
1 2 3 4 |
$ vim xhprof-pr/external/header.php ~省略~ #コメントアウト //register_shutdown_function('xhprof_shutdown_function'); |
・config.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ cp xhprof_lib/config.sample.php xhprof_lib/config.php $ vim xhprof_lib/config.php <?php $_xhprof = array(); // Change these: $_xhprof['dbtype'] = 'mysql'; // Only relevant for PDO $_xhprof['dbhost'] = 'xxxxxxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com'; $_xhprof['dbuser'] = 'root'; $_xhprof['dbpass'] = 'xxxxxxxxxxxxxxxxx'; $_xhprof['dbname'] = 'xhprof'; $_xhprof['dbadapter'] = 'Pdo'; $_xhprof['servername'] = 'myserver'; $_xhprof['namespace'] = 'myapp'; $_xhprof['url'] = 'http://xhprof.adachin.com'; /* * MySQL/MySQLi/PDO ONLY $controlIPs = false; //$controlIPs[] = "10.0.0.52"; // localhost, you'll want to add your own ip here //$controlIPs[] = "::1"; // localhost IP v6 |
DBの設定と$controlIPsは使わないのでfalseにしてそれ以下はコメントアウトします。
・make database xhprof
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 |
mysql> CREATE DATABASE xhprof; Query OK, 1 row affected (0.01 sec) mysql> show databases; +----------------------+ | Database | +----------------------+ ~省略~ | xhprof | +----------------------+ xx rows in set (0.01 sec) mysql> use xhprof; Database changed mysql> show tables; Empty set (0.00 sec) 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; Query OK, 0 rows affected, 1 warning (0.06 sec) mysql> show tables; +------------------+ | Tables_in_xhprof | +------------------+ | details | +------------------+ 1 row in set (0.01 sec) |
テーブル作成はxhprof_lib/utils/Db/Pdo.phpに書いてるのでそのままコピペ。
・/etc/httpd/conf.d/xhprof.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<VirtualHost *:80> DocumentRoot "/home/adachin/htdocs/xhprof-pr/xhprof_html" ServerName xhprof.adachin.com <Directory "/home/adachin/htdocs/xhprof-pr/xhprof_html"> Order allow,deny Allow from all AllowOverride All AuthType Digest AuthName "xhprofdayo" AuthUserFile "/home/adachin/htdocs/xhprof-pr/xhprof_html/.htdigest" Require valid-user </Directory> CustomLog /var/log/httpd/xhprof.adachin.com_access.log combined env=!no_log ErrorLog /var/log/httpd/xhprof.adachin.com_error.log php_admin_value auto_prepend_file "/home/adachin/htdocs/xhprof-pr/external/header.php" </VirtualHost> |
nginxでもheader.php読むように設定すればOK。念のためダイジェスト認証も。
久々apache触った。。。apache再起動忘れずに。
ちなみにxhguiはプロファイル結果を可視化して分かりやすく表示するもの。
・確認
アクセスすればこんなUIが出てくるはず。
しかし!
これだけではない!!
■graphviz
プロファイル結果をグラフ表示するgraphvizを入れないとアカン。
・graphviz graphviz-gd
1 |
$ sudo yum install graphviz graphviz-gd |
・config.php
1 2 3 4 5 6 7 |
$ vim xhprof_lib/config.php #コメントアウト外す //These are good for linux and its derivatives. $_xhprof['dot_binary'] = '/usr/bin/dot'; $_xhprof['dot_tempdir'] = '/tmp'; $_xhprof['dot_errfile'] = '/tmp/xh_dot.err'; |
■解析
・index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
if (function_exists('xhprof_enable')) { xhprof_enable(); } // Boot the app require APPPATH.'bootstrap.php'; if (function_exists('xhprof_disable')) { register_shutdown_function(function() { $xhprof_data = xhprof_disable(); $XHPROF_ROOT = __DIR__.DIRECTORY_SEPARATOR.'xhgui'; $XHPROF_SOURCE_NAME = 'fuelphp' define('XHPROF_LIB_ROOT', $XHPROF_ROOT . '/xhprof_lib/'); global $_xhprof; include_once $XHPROF_ROOT . "/xhprof_lib/config.php"; include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php"; // include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs_mysql.php"; include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, $XHPROF_SOURCE_NAME); }); } |
適当にアクセスしたいページF5してxhprofのページからRunIDをクリックすると。。。
おおおおどこが怪しいか分かる!!
■まとめ
PHPで開発してる人は導入検討してみるといいかも!可視化すばらっ。
参考
http://i-plug-tech.hatenablog.com/entry/2017/01/04/231534
https://qiita.com/w_cota/items/48667a845cd06d969d4a
0件のコメント