LoginSignup
1
2

More than 5 years have passed since last update.

Phan Daemon Modeおためし

Posted at

先日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を実行したときの出力がどうなるかためしてみます。

正常系

src/Sample.php
<?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のメッセージと同じ

シンタックスエラー

src/Sample.php
<?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エラー

src/Sample.php
<?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の実行は速い
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2