KUSANAGIでxdebugのインストールとよく使う機能を紹介

王文暁

KUSANAGI環境でのXdebugインストールとPHP開発を強化するヘルパー関数やプロファイリングに関する使い方を詳細に解説。開発者のデバッグ作業を効率化します。

phpプログラムを使用する上で、xdebugを使用してコードを解析する必要がある場合があります。この記事では、kusanagiにxdebugのインストールと、一般的に使用されるxdebugの使用方法を紹介します。

KUSANAGI環境でxdebugのインストール

KUSANAGI環境へのxdebugのインストールは非常に簡単で、peclを使って直接インストールことができます。

下記はphp8.1を使用してxdebugをインストールする例です。

1,php develをインストール
dnf install kusanagi-php81-devel

gcc、php-config、その他の関連ツールをインストールします。

2,xdebugをインストール
pecl install xdebug

このコマンドを使うと、適切なバージョンのxdebugが自動的にコンパイルされ、インストールされます。

一部分結果

Build complete.
Don't forget to run 'make test'.

running: make INSTALL_ROOT="/tmp/pear/temp/pear-build-rootJkhTgK/install-xdebug-3.3.0" install
Makefile:244: 警告: ターゲット 'test' のためのレシピを置き換えます
Makefile:136: 警告: ターゲット 'test' のための古いレシピは無視されます
Installing shared extensions:     /tmp/pear/temp/pear-build-rootJkhTgK/install-xdebug-3.3.0/opt/kusanagi/php-8.1/lib64/extensions/no-debug-non-zts-20210902/

  +----------------------------------------------------------------------+
  |                                                                      |
  |   INSTALLATION INSTRUCTIONS                                          |
  |   =========================                                          |
  |                                                                      |
  |   See https://xdebug.org/install.php#configure-php for instructions  |
  |   on how to enable Xdebug for PHP.                                   |
  |                                                                      |
  |   Documentation is available online as well:                         |
  |   - A list of all settings:  https://xdebug.org/docs-settings.php    |
  |   - A list of all functions: https://xdebug.org/docs-functions.php   |
  |   - Profiling instructions:  https://xdebug.org/docs-profiling2.php  |
  |   - Remote debugging:        https://xdebug.org/docs-debugger.php    |
  |                                                                      |
  |                                                                      |
  |   NOTE: Please disregard the message                                 |
  |       You should add "extension=xdebug.so" to php.ini                |
  |   that is emitted by the PECL installer. This does not work for      |
  |   Xdebug.                                                            |
  |                                                                      |
  +----------------------------------------------------------------------+


running: find "/tmp/pear/temp/pear-build-rootJkhTgK/install-xdebug-3.3.0" | xargs ls -dils
   601608    0 drwxr-xr-x. 3 root root      17 12月  7 12:05 /tmp/pear/temp/pear-build-rootJkhTgK/install-xdebug-3.3.0
 25625976    0 drwxr-xr-x. 3 root root      22 12月  7 12:05 /tmp/pear/temp/pear-build-rootJkhTgK/install-xdebug-3.3.0/opt
 36555662    0 drwxr-xr-x. 3 root root      21 12月  7 12:05 /tmp/pear/temp/pear-build-rootJkhTgK/install-xdebug-3.3.0/opt/kusanagi
 65580440    0 drwxr-xr-x. 3 root root      19 12月  7 12:05 /tmp/pear/temp/pear-build-rootJkhTgK/install-xdebug-3.3.0/opt/kusanagi/php-8.1
 71395686    0 drwxr-xr-x. 3 root root      24 12月  7 12:05 /tmp/pear/temp/pear-build-rootJkhTgK/install-xdebug-3.3.0/opt/kusanagi/php-8.1/lib64
 93535163    0 drwxr-xr-x. 3 root root      39 12月  7 12:05 /tmp/pear/temp/pear-build-rootJkhTgK/install-xdebug-3.3.0/opt/kusanagi/php-8.1/lib64/extensions
100713551    0 drwxr-xr-x. 2 root root      23 12月  7 12:05 /tmp/pear/temp/pear-build-rootJkhTgK/install-xdebug-3.3.0/opt/kusanagi/php-8.1/lib64/extensions/no-debug-non-zts-20210902
100713552 2768 -rwxr-xr-x. 1 root root 2831160 12月  7 12:05 /tmp/pear/temp/pear-build-rootJkhTgK/install-xdebug-3.3.0/opt/kusanagi/php-8.1/lib64/extensions/no-debug-non-zts-20210902/xdebug.so

Build process completed successfully
Installing '/opt/kusanagi/php-8.1/lib64/extensions/no-debug-non-zts-20210902/xdebug.so'
install ok: channel://pecl.php.net/xdebug-3.3.0
configuration option "php_ini" is not set to php.ini location
You should add "zend_extension=/opt/kusanagi/php-8.1/lib64/extensions/no-debug-non-zts-20210902/xdebug.so" to php.ini
3,xdebugを有効にします

下記の手順によって操作すれば、有効になります。

cp /opt/kusanagi/php-8.1/lib64/php/doc/xdebug/xdebug.ini /etc/opt/kusanagi/php.d/extensions/xdebug.ini
echo 'zend_extension=/opt/kusanagi/php-8.1/lib64/extensions/no-debug-non-zts-20210902/xdebug.so' >> /etc/opt/kusanagi/php.d/extensions/xdebug.ini

有効にしてから、”kusanagi php”コマンドを実行して、phpを再起動します。”php -m |grep xdebug”というコマンドを実行して、xdebugというモジュールが出たら成功しました。

KUSANAGIの環境でxdebugだけでなく、他のphpエクステンションもこの方法でインストールできます。

xdebugのよく使う機能

ヘルパー関数

xdebugには様々な優れたヘルパー関数があります。重要だと思う関数を紹介します。

var_dump()

元のvar_dump関数の機能強化しました。

利用例

$c = new stdClass;
$c->foo = 'bar';
$c->file = fopen( '/etc/passwd', 'r' );
var_dump(
     array(
         array(TRUE, 2, 3.14, 'foo'),
         'object' => $c
     )
 );

返される結果

元々のvar_dump()より、情報は豊になりました。要素のタイプ、配列の長さ、オブジェクトの内容もあります。

xdebug_get_function_stack() : array

この関数を実行すると、今までのコールチェーン、実行時間の割合、関数名、メモリー、ファイル名など情報が見えます。

利用例

function b(){
    a();
}
function a(){
 
    var_dump(xdebug_get_function_stack());
}
b();

返される結果

xdebug_get_headers() : array

PHP の header()。setcookie() 関数のコールによって設定されたヘッダをすべて返します。HTTP headerのデーターを検査しやすくなります。

利用例

header( "X-Test", "Testing" );
setcookie( "TestCookie", "test-value" );
var_dump( xdebug_get_headers() );

返される結果

xdebug_get_monitored_functions() : array

監視対象の関数に関する情報を返します。

利用例

xdebug_start_function_monitor( [ 'strrev', 'array_push' ] );

echo strrev("yes!"), "\n";

echo strrev("yes!"), "\n";

var_dump(xdebug_get_monitored_functions());
xdebug_stop_function_monitor();

返される結果

xdebugには多くのヘルパー関数も含まれています。使い方は公式ドキュメントでご覧ください。

https://xdebug.org/docs/develop

プロファイリング

xdebugのプロファイラにより、スクリプトのボトルネックを見つけ、KCacheGrindのような外部ツールで可視化することができます。

下記はxdebugのプロファイリングの使用例です。

1,プロファイリングを有効にします

# xdebugのモードがプロファイルに変更
xdebug.mode=profile
# トリガーモードでの機能起動
xdebug.start_with_request=trigger
# トリガーのバリュー
xdebug.trigger_value=tigger_now
# profileファイルの格納場所
xdebug.output_dir=/tmp

上記の設定を/etc/opt/kusanagi/php.d/extensions/xdebug.iniに追加すると、機能は有効になります。

2,遅いスクリプトの例があります

test.php
<?php
require_once 'test2.php';
d();
test2.php
<?php
function d(){
    sleep(3);
    c();
}
function c(){
    sleep(3);
    echo 'c()';
}

3,profileファイル作成

test.phpのボトルネックを見つけたい時,XDEBUG_TRIGGERがGETで設定されると、xdebugはその機能を開始します。

/tmpフィルダーに、cachegrind.out.***のようなprofileファイルがあります。中はボトルネックの情報を格納されています。

4,可視化

可視化になるとき、QCacheGrindというソフトウェアが必要です。下記はダウンロードURLです。

http://sourceforge.net/projects/qcachegrindwin/

QCacheGrindでprofileファイルを開くと、コールチェーン、実行時間の割合、関数名、ファイル名などいろんな情報が見えます。

profileによって、sleepという関数が遅いのはわかりました。

最後

スクリプトの性能ボトルネックがある時、xdebugはいい性能分析ツールです。

参考

https://xdebug.org/

<< PHP 8.1(or 8.2) + WordPress 6.3 = ???KUSANAGI9でZabbixサーバ6.0をインストールする方法 >>

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解