先日0.9.2がリリースされたPhan
気になった機能が実装されていたのでさわってみることにしました。
Phan Daemon Mode
1つのファイルに対してissueを検出するための機能
IDEやエディタ上でPhanを動かしたいときに有用
Requirements
- Phan 0.9.2+ or 0.8.4+
- Mac or Linux (Windowsは未対応)
- pcntl extension
使い方
デーモンを起動
$ vendor/bin/phan --daemonize-tcp-port 4846 --quick
Listening for Phan analysis requests at tcp://127.0.0.1:4846
phan_clientを実行
$ vendor/bin/phan_client -l src/Sample.php
phan_clientはデーモンとの間で通信を行い結果を出力します。
IDEやエディタにこの結果を反映させるためには別途プラグインを用いる必要があります。
phan_clientの出力結果
サンプルコードに対してphan_clientを実行したときの出力がどうなるかためしてみます。
正常系
<?php
namespace PhanTest;
class Sample
{
public function foo()
{
return 'zzz';
}
}
$ vendor/bin/phan_client -l src/Sample.php
No syntax errors detected in src/Sample.php
php -l
のメッセージと同じ
シンタックスエラー
<?php
namespace PhanTest;
class Sample
{
public function foo()
{
return 'zzz'
}
}
$ vendor/bin/phan_client -l src/Sample.php
Parse error: syntax error, unexpected '}', expecting ';' in src/Sample.php on line 10
Errors parsing src/Sample.php
Files were syntactically invalid
シンタックスエラーもphp -l
のメッセージとだいたい同じ
Phanエラー
<?php
namespace PhanTest;
class Sample
{
public function foo()
{
// Exceptionクラスがない
try {
} catch (Exception $e) {
}
}
}
$ vendor/bin/phan_client -l src/Sample.php
No syntax errors detected in src/Sample.php
Phan error: UndefError: PhanUndeclaredClassCatch: Catching undeclared class \PhanTest\Exception in src/Sample.php on line 11
シンタックスエラーなしのメッセージとPhanエラーの内容の両方が出力されます。
またこの例ではないですが複数のPhanエラーがあるときは全部出力されます。
シンタックスエラーとPhanエラーが同時にあるときはシンタックスエラーだけが出力されます。
IDE/エディタとの連携
ドキュメントにはvimとemacsのプラグインを使った例があります。
vimだけ言及しますとプラグインはこちらで
https://github.com/etsy/phan/blob/master/plugins/vim/phansnippet.vim
確かにこれでも動作はしますが同期的に実行されるので、非同期で実行させたい場合はvim-watchdogsなどと組み合わせるのがよさそうです。
すでにphp -l
などを非同期実行させている場合はこれをvendor/bin/phan_client -l
に置き換えればよいので導入はそれほど難しくなさそうです。
またPhpStormのプラグインはないかと探してみましたが、いまのところはまだないようでした。
その他
デーモンを起動するときに解析対象になっていないファイルはPhanエラーのチェックがされない
デーモンを起動したあとに新規ファイルを追加したりリネームした場合はデーモンを再起動する必要があります。
またドキュメントにもあるとおりgit checkout
したときも同様です。
デーモンの起動時間
解析対象ファイルが約10000で約30秒程度かかりました。
解析対象が少なければもう少し起動も速い。
デーモンのメモリ使用量
400M程度
phan_clientの実行時間
サンプルのsrc/Sample.php
で1〜2秒程度
シンタックスエラーのときはこれより速い
まとめ
- Phanをデーモンモードで起動しphan_clientを実行、結果を出力
- phan_clientの結果を使ってIDEやエディタとの連携が可能
- 新規ファイル作成や
git checkout
の際はデーモンの再起動が必要
ここは若干面倒 - デーモンの起動は解析対象が大きいときはやや時間がかかる
- phan_clientの実行は速い