ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    PHPのプロファイラー「XHProf」の使い方

    このエントリーを含むはてなブックマーク はてなブックマーク - PHPのプロファイラー「XHProf」の使い方 あとで読む
    PHPでプログラムを作っているとき、プログラムの実行状況を確認するため、プロファイラーというツールを使います。
    プロファイラとは 【profiler】 - IT用語辞典

    プロファイラとは、動作中のプログラムがどの処理をどういった順序で実行したかを監視するプログラム。
    プログラムの障害を見つけるために用いられるよりも、プログラムの余計な部分を削るなどして高速化するために用いられることが多い。



    PHP用の「XHProf」という便利なプロファイラーが紹介されていました。
    PHPプログラムを解析して何処が重いか?がブラウザ上で簡単に分かる「XHProf」:phpspot開発日誌

    PHPプログラムを解析して何処が重いか?がブラウザ上で簡単に分かる「XHProf」。
    Callgraphというものが見れるらしい。
    プログラム実行の遷移図みたいなもので、重い部分を赤とか黄で視覚的に表示してくれる…、ってこれは凄い!



    PECL :: Package :: xhprof
    XHProfの開発者は、アメリカのfacebook.comのエンジニアさんたちでした。
    XHProfは、Facebookの開発で使われているツールなんですね。

    XHProfを使ってみたら、プログラムの流れを可視化した「Callgraph」というグラフが便利でした。
    Callgraphは、ボトルネックの発見だけでなく、プログラムの流れをトレースするときにも役立つと思います。
    既存のPHPアプリをカスタマイズするときに、内部の動作がどうなっているのかを調べる等、使い方がいろいろありそうです。

    (以下、XHProfのインストール方法&使い方のメモ)
    ●XHProfのインストール方法
    XHProfのインストール方法が紹介されていました。
    英語の紹介ページ
    Installing the XHProf Extension
    日本語の紹介ページ
    【CakePHP】xhprofでCakePHPのパフォーマンスを丸裸にする | ECWorks Blog

    コンパイル及びインストール方法は次の通り。

    tar xvfz xhprof-0.9.0.tgz
    cd xhprof-0.9.0/extension/
    phpize
    make
    make test
    make install

    インストール後、php.iniを開き、エクステンションを登録します。

    extension=xhprof.so

    apacheを再起動し、一応phpinfo()でxhprofが正常に起動しているか確認します。


    (ちなみに、ブログライターのMASA-Pさんは「PHPで作る携帯サイトデベロッパーズガイド」の著者でした。)
    PHPで作る携帯サイトデベロッパーズガイド
    滝下 真玄
    秀和システム
    2009-12
    3150円



    ●Ubuntuで使用する場合
    上記の手順を参考にして、WebサーバにXHProfをインストールしてみました。
    WebサーバのOSは、Linux(Ubuntu 9.10)です。


    ●コンソール画面を起動
    Ubuntu9.10にログインして、GNOME 端末等のコンソール画面を起動します。
    (Webサーバを外部のパソコンから遠隔操作する場合は、SSHクライアントソフトを起動して、Webサーバにログインします。)
    コマンドを入力するとき、いちいち管理者権限を付与する「sudo」をコマンドの前に付記するのは面倒なので、一番最初に「sudo su」を入力して、管理者としてインストール作業を行えば便利かも。

    以下、シェルのコマンドプロンプト(root@web-server:/home/webapp# のような表示部分)は「#」と略記します。

    # cd /var/www/ ←インストールする場所に移動
    # wget http://pecl.php.net/get/xhprof-0.9.2.tgz ←XHProfの最新版をダウンロード
    # tar xvfz xhprof-0.9.2.tgz ←圧縮ファイルを展開
    # cd xhprof-0.9.2/extension/ ←展開したフォルダ内の「extension」フォルダに移動
    # phpize ←コンパイルの準備処理
    # ./configure --with-php-config=/usr/bin/php-config ←インストールの設定
    # make ←コンパイル
    # make test ←コンパイルエラーのチェック
    # make install ←インストール


    スムーズに行けば、上記の手順でインストールが完了するはずですが、自分の環境では途中でエラーが出ました。


    ●phpizeのインストール
    インストールの途中で「phpize」というコマンドを打つと、「phpize」というコマンドは使えない(存在していない)というエラーメッセージが出ました。

    phpize: command not found


    対処法は、php5-devをインストールすれば「phpize」というコマンド(プログラム)が利用できるようになります。

    # apt-get install php5-dev ←php5-devをインストール



    (参考)
    http://dqn.sakusakutto.jp/2009/11/ubuntu904peclmemcachedphpize.html
    phpizeエラーが出る場合の対処法
    http://www.php.net/manual/ja/install.pecl.phpize.php
    phpize で共有 PECL 拡張モジュールをコンパイルする方法

    もう一度やり直したら、今度はphpizeが無事通りました。

    # phpize
    Configuring for:
    PHP Api Version: 20041225
    Zend Module Api No: 20060613
    Zend Extension Api No: 220060519




    ●コンフィギャ

    # ./configure --with-php-config=/usr/bin/php-config


    「php-config」というPHPの設定ファイルがどこにあるのか分からなくて、検索したら
    /usr/bin/
    の中にありました。

    (参考)「php-config」って何?
    http://php.net/manual/ja/configure.about.php


    ●make test
    (参考)「make test」って何?
    http://oshiete1.watch.impress.co.jp/qa5379043.html

    インストールが完了したら、XHProfを使えるようにする設定を行います。


    ●php.ini
    PHPの設定ファイル「php.ini」に、「extension=xhprof.so」という設定を追加します。

    php.iniファイルがある場所

    /etc/php5/apache2/php.ini


    (参考)php.iniの場所、役割について
    http://d.hatena.ne.jp/abe_koji/20080227/1204075329
    http://itpro.nikkeibp.co.jp/article/COLUMN/20070307/264097/

    php.iniのある場所に移動して、vimエディタを使って編集します。

    # cd /etc/php5/apache2/
    # vim php.ini



    php.iniを開くと、拡張機能のディレクティブ(項目)をまとめてある場所があるので、そこに追記してみます。

    ;;;;;;;;;;;;;;;;;;;;;;
    ; Dynamic Extensions ;
    ;;;;;;;;;;;;;;;;;;;;;;
    ;
    ; If you wish to have an extension loaded automatically, use the following
    ; syntax:
    ;
    ; extension=modulename.extension;
    ; For example, on Windows:
    ;
    ; extension=msql.dll;
    ; ... or under UNIX:
    ;
    ; extension=msql.so
    ;
    ; Note that it should be the name of the module only; no directory information
    ; needs to go here. Specify the location of the extension with the
    ; extension_dir directive above.
    extension=xhprof.so ←XHProfを使うようにする設定




    ●Apacheを再起動
    XHProfのインストールと設定が完了したら、Apacheを再起動して、XHProfを稼動させます。

    # /etc/init.d/apache2 restart ←Apacheの再起動




    ●phpinfo()で確認
    phpinfo()関数で、XHProfの稼動状況を確認します。
    =「xhprof」という項目が表示されていればOK。
    XHProf_phpinfo


    ●XHProf UI設置
    XHProfの動作を確認したら、いよいよXHProfの表示画面(ユーザーインターフェース)を設置します。
    「xhprof_html」と「xhprof_lib」をドキュメントルート以下にコピーします。
    上記の手順でやった場合だと、
    /var/www/xhprof-0.9.2/
    の中に「xhprof_html」フォルダと「xhprof_lib」フォルダがあるので、これを使えばOKです。
    「xhprof-0.9.2」というフォルダ名を「xhprof」に変更しておくと良いと思います。


    ●XHProfの使い方
    XHProfでプロファイリング(動作状況に関するデータを収集)するには、
    ・収集の開始点=xhprof_enable();
    ・収集の終了点=xhprof_disable();
    という二つのコードを記述します。

    使い方の詳細は、XHProfのドキュメントで紹介されています。
    XHProf Documentation - 4. Profiling using XHProf


    ●CodeIgniterで利用
    PHPフレームワーク「CodeIgniter」で、XHProfを使ってみました。
    CodeIgniterでXHProfを使用するために、動作の開始ファイル(エントリーポイント)になっている「index.php」にプロファイラーのコードを入れてみました。

    (1) index.phpの先頭部分に入れたコード
    <?php
    //----------------------------------------
    // XHProfを使うかどうかの設定 TRUE / FALSE
    $xhprof_mode = TRUE;

    // start profiler
    if ($xhprof_mode) {
    xhprof_enable();
    }
    //----------------------------------------


    xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
    というふうに、オプションも追加できます。

    (2) index.phpの末尾部分に入れたコード
    //----------------------------------------
    // stop profiler
    if ($xhprof_mode) {
    $xhprof_data = xhprof_disable();

    $XHPROF_ROOT = '/var/www/xhprof'; //xhprofをインストールしたディレクトリ
    $XHPROF_SOURCE_NAME = 'CodeIgniter';
    include_once $XHPROF_ROOT . '/xhprof_lib/utils/xhprof_lib.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);

    echo "<a href='http://mydomain.com/xhprof/xhprof_html/index.php?run=$run_id&source=$XHPROF_SOURCE_NAME' target='_blank'>xhprof Result</a>";
    }
    //----------------------------------------


    これで、CodeIgniterでXHProfが使えました。


    ●XHProfの汎用的な使い方
    XHProfの使い方を便利にする方法が紹介されていました。
    PHP用のプロファイラXHProf - ぱせらんメモ

    (おまけ)auto_prepend_fileで自動的に



    <?php

    function __xhprof_finish() {
    // stop profiler
    $xhprof_data = xhprof_disable();

    $XHPROF_ROOT = '/home/webap/xhprof'; // xhprofをインストールしたディレクトリ
    $XHPROF_SOURCE_NAME = 'app_name'; // アプリ名とか識別する名前
    include_once $XHPROF_ROOT . '/xhprof_lib/utils/xhprof_lib.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);

    // ビューアへのリンク(お好みで)
    echo "<a href='http://xhprofのビューア/index.php?run=$run_id&source=$XHPROF_SOURCE_NAME'>xhprof Result</a>";
    }

    xhprof_enable();
    register_shutdown_function('__xhprof_finish');

    ?>


    こんな感じのをauto_prepend_fileで指定しとけば自動的に全体をプロファイリングしてくれるようになる。




    ●auto_prepend_fileとは?
    http://jp2.php.net/manual/ja/ini.core.php#ini.auto-prepend-file

    auto_prepend_file string
    メインファイルの前に自動的に付加されるファイルの名前を指定します。



    CodeIgniterの場合、hook機能を使って自動的に呼び出す方法もありでしょうか?


    【2012/04/25 追記 ここから】
    (参考)CodeIgniterでXHProfをフックする方法 - 浜村拓夫の世界
    【2012/04/25 追記 ここまで】


    ●XHProfの結果
    実行されたメソッドや関数
    XHProf_report

    処理の流れと所要時間
    XHProf_callgraph

    XHProfのcallgraphが気に入りました!
    Facebookはこういう便利なツールを使って開発されているんですね。
    いろんなPHPアプリのcallgraphを眺めてみようと思います。

    関連記事

    コメント

    ご紹介ありがとうございます!

    XHProfの件で当方の記事をご紹介いただきましてありがとうございます(さらに「PHPで作る携帯サイト デベロッパーズガイド」のご紹介もありがとうございます!)。当方の記事はちょっと不親切だったので、より良い分かりやすい解説で素晴らしいです。
    サンプルではCodeIgniterを試されているみたいですが…それにしてもCakeと全然違いますね(笑)。

    問題解決の所要時間

    >MASA-P様
    XHProfの使い方をご紹介いただき、どうもありがとうございました。
    知りたかった情報がすぐに見つかって助かりました。
    携帯サイト作成のノウハウも大変参考になります。
    またブログで有益な情報を提供していただければと思います。
    よろしくお願いいたします。m(__)m

    でろでろ!
    (~=~)

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/466-e28748c4

    FC2Ad