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はいい性能分析ツールです。
参考