PHPで開発されたパフォーマンスの悪いサイトをいきなり任されたらどうしますか?
最悪、逃げる(休職・退職など)という選択肢もアリでしょう。
でも、逃げない場合はサイトの調査をしなければなりません。
現状調査というヤツですね。
その場合、どうしますか?
関数や処理の前後に「echo time();」を書きまくりますか?
確かに、昔はそういうこともしましたね・・・
でも、今はもうそんなことをする必要はありません。
tidewaysを使えば、すべて解決できます。
本記事の内容
- tidewaysとは?
- tidewaysのインストール
- tidewaysでプロファイリングする
それでは、上記に沿って解説していきます。
tidewaysとは?
tideways公式
https://tideways.com/
まず、次の画像を見てください。
tidewaysで出力できるグラフです。
簡単に言うと、tidewaysは「Chrome DevTools」(Chromeデベロッパーツール)のPHP版です。
Chrome DevToolsを使って、ページ(クライアント側)のパフォーマンスを調べたことがあるでしょう。
もっと言うと、PHP版というよりサーバーサイド版と言えるかもしれません。
さて、tideways公式サイトを見ると、tidewaysが有償のツールだと思うでしょう。
実際、tidewaysは有償のツールです。
しかし、この記事では有償のツールを紹介するのが目的ではありません。
基本的には、オープンソースでなんとかすることが理想です。
ただ、tideways自体はオープンソースとして公開はされていません。
その代わりに、tideways_xhprofというPHP拡張モジュールがオープンソースとして公開されています。
このtideways_xhprofを使えば、PHPをプロファイリングすることができます。
つまり、必要最低限のパフォーマンス分析用のデータが収集可能となります。
XHProfとは?
XHProfは、タイトルに含めています。
そして、PHP拡張モジュールであるtideways_xhprofの名称にも含まれています。
XHProfは、FaceBookが開発したPHP用のプロファイラです。
機能的にはtideways_xhprofと同じです。
しかし、FaceBookはもうXHProfの開発を止めてしまいました。
そのため、FaceBook製のXHProfはPHP 7には対応していません。
インストールの時点で失敗します。
まとめ
本家XHProfが、PHP 7では利用できません。
そこで、tideways_xhprofが利用されることになりました。
tideways_xhprof
https://github.com/tideways/php-xhprof-extension
しかし、すでに有志が協力してXHProfをPHP 7に対応しています。
FaceBookは、もう手を引いているようですけど。
https://github.com/yaoguais/phpng-xhprof
両方の状況を見た限りでは、tideways_xhprofが優勢です。
情報量もtideways_xhprofの方が勝っていますからね。
tidewaysのインストール
tidewaysは、正確にはtideways_xhprofのことです。
インストール要件は、以下。
- PHP >= 7.0
- OS: Linux, MacOS, Windows
- Architectures: x64/amd64, x86, ARM, PowerPC
- Non-Threaded (NTS) or Threaded (ZTS) support
PHP 8系に対応しているようです。
ソースをコンパイルしてインストールしている記事をよく見かけます。
でも、コンパイル済みのモノが公開されています。
折角なので、それを使わせてもらいましょう。
ソースからのインストールはできる限り避けています。
以下のページから、ダウンロードが可能です。
https://github.com/tideways/php-xhprof-extension/releases
Debian/Ubuntuであるため、debパッケージをダウンロードします。
# wget https://github.com/tideways/php-xhprof-extension/releases/download/v5.0.4/tideways-xhprof_5.0.4_amd64.deb
ダウンロードできたら、debパッケージをインストール。
# dpkg -i tideways-xhprof_5.0.4_amd64.deb
完了すると、以下のディレクトリに共有ライブラリが設置されています。
# ls /usr/lib/tideways_xhprof/ tideways_xhprof-7.0.so tideways_xhprof-7.3-zts.so tideways_xhprof-7.1.so tideways_xhprof-7.4.so tideways_xhprof-7.1-zts.so tideways_xhprof-7.4-zts.so tideways_xhprof-7.2.so tideways_xhprof-8.0.so tideways_xhprof-7.2-zts.so tideways_xhprof-8.0-zts.so tideways_xhprof-7.3.so
次に、php.iniに追記します。
利用しているPHPのバージョンに合わせたものを読み込むように記述します。
extension=mysql.so extension=/usr/lib/tideways_xhprof/tideways_xhprof-7.0.so
通常は、フルパスで記述する必要はありません。
なぜなら、拡張モジュールは特定のディレクトリ(extension_dir)に保存されるからです。
そして、extension_dir以下のファイルを読み込むようになっています。
しかし、tideways_xhprofの場合はextension_dirには存在していません。
そのため、フルパスで指定する形となります。
あとは、php.iniへの追加を反映させるために、Apacheの再起動・リロードを実施します。
以上、tidewaysのインストールです。
最後に、実際に動作検証を行いましょう。
tidewaysでプロファイリングする
公式の使用例を参考にして、以下のコードを用意。
<?php tideways_xhprof_enable(); // your application code my_application(); $data = tideways_xhprof_disable(); file_put_contents( sys_get_temp_dir() . "/" . uniqid() . ".yourapp.xhprof", serialize($data) ); function my_application() { my_function_1(); } function my_function_1() { my_function_2(); } function my_function_2() { echo "end"; } ?>
上記コードを実行すると、すんなりと動きました。
同一ディレクトリには、「5fe415eb7c049.yourapp.xhprof」が作成されています。
「5fe415eb7c049」はランダムに決まります。
保存されたデータは、以下の配列です。
array(5) { ["main()"]=> array(2) { ["ct"]=> int(1) ["wt"]=> int(81) } ["my_function_1==>my_function_2"]=> array(2) { ["ct"]=> int(1) ["wt"]=> int(75) } ["main()==>my_application"]=> array(2) { ["ct"]=> int(1) ["wt"]=> int(78) } ["my_application==>my_function_1"]=> array(2) { ["ct"]=> int(1) ["wt"]=> int(77) } ["main()==>tideways_xhprof_disable"]=> array(2) { ["ct"]=> int(1) ["wt"]=> int(1) } }
正直、これを見ただけではよくわかりません。
そのために、xhprof形式のデータを視覚化するツールなどが用意されています。
xhprof形式のデータを活かした分析に関しては、また別の記事で解説します。