PHP 7以上ならXHProfではなくtidewaysを使いましょう

PHP 7以上ならXHProfではなくtidewaysを使いましょう プログラミング

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形式のデータを活かした分析に関しては、また別の記事で解説します。

タイトルとURLをコピーしました