Laravel、xdebugを使わずにPsySHでデバッグする

タグ: Laravel  

xdebugは、たとえば前任者から引き継いだ謎コードを全般的に解き明かすとか、システム移行により広範囲に渡る調査や移植が必要である場合には便利です。

ただし、PHPの動作環境には負担がかかりますので、開発マシン上でユニットテストを行うような環境では、負担になります。テストが数多くなると、実行時間が余計にかかります。

そのため、PHPのver_dumpや、Laravelでしたらddヘルパーが用意されています。調べたい変数が限定的であったり、不具合のあたりがついている場合には、これが便利です。

それ以上を調べる場合でも、デバッガの力を借りたくない場合は、Laravelに組み込まれているPsySHを利用できます。

PsySH

PsySHは、PHPのREPLライブラリです。インタプリタのようにコードを実行できます。

PHPはもともと'-a'オプションを付け実行することで、インタープリター実行できますが、それをより便利にしたのがPsySHです。

インストールしたLaravelをREPL動作させたい場合は、Artisanコマンドで実行します。

php artisan tinker

PsySH自体の機能については、既にネット上に日本語記事も多少ありますし、原文英語のマニュアルもさほど面倒ではありませんので、調べてください。のちほど当サイトでも、Laravelを使った開発に、利用する方法を記事にするかもしれません。

さて、Artisanコマンドで起動した状態では、Laravelの関数の動作を調べるとかには便利ですが、デバッグには使えません。

デバッグしたい箇所に以下のコードを挿入してください。

eval(\Psy\sh());

この行が実行されるとPsySHが起動され、変数の内容を調べたりできるようになります。

Artisanコマンドラインのデバッグでは、実際にコマンドを実行して、PsySHへ実行が移行したら、調査するわけです。では、Webアプリではどう使用するのでしょうか。

Web環境での実行

PsySHをWebサーバー動作するプログラムのデバッグに使用するには、PHPの組み込みサーバーで実行します。

Laravelには組み込みサーバーとして動作させる、Artisanコマンドが用意されています。

php artisan serve

ただ、これで組み込みサーバーを起動してしまうと、PsySHが出力するコマンドラインのダイアログが表示されません。Artisanコマンドが入出力の制御を奪ってしまうためです。

ですから、Artisanコマンドとしてではなく、PHP自体を起動します。ドキュメントルートから、端末にて以下のコードを実行します。

php -S localhost:8000 -t public server.php

これで、eval(\Psy\sh());が実行されると、PsySHのREPL動作へ移行します。そうなれば、自由に変数を調べたり、内容を変更したりして、デバッグできます。

PsySHの実行を抜け、元のPHPコードを続けて実行させるには、exitコマンドをREPL状態の入力プロンプトに対し実行します。

もちろん、組み込みサーバーを停止させるには、CTRL+Cで強制終了させます。

readline拡張

当サイトで紹介するたびに書いていますが、PHPのreadline拡張が必要です。もしくは、readlineと同等の機能の拡張が必要です。

未だに、カーソルが効かないとか言う記事を目にしますので、念の為に書いておきます。