開発環境 (Mac) で PHP の静的解析がしたくて Phan を導入した。
さくっといけるかと思いきやいろいろつまづいたので備忘。
参考
PHP7 を準備
phan が要求する PHP7 を導入する。今回は PHP5.6 も同居させたいので phpbrew を使う。
以下のエントリが参考になった。
MacでのPHP開発はphpbrewが非常に良い | karakaram-blog
phpbrew をインストール
以下のドキュメントを見つつ進める。
phpbrew をダウンロードしてパスの通ったところに配置する。
% curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
% chmod +x phpbrew
% mv phpbrew ~/bin/
初期設定のコマンドを実行。
% phpbrew init
.zshrc
に以下の記述を追記。
if [ -d ${HOME}/.phpbrew ]; then
source $HOME/.phpbrew/bashrc
fi
利用可能なPHPのバージョンを調べる。
% phpbrew known
7系で最新のバージョンをインストールする。
% phpbrew install 7.0.13 +default
ちなみに 5.3.x のような古いバージョンを入れたい時は --old
オプションで表示される。
% phpbrew known --old
インストールが完了したらバージョンを切り替える。
% phpbrew switch php-7.0.13
phan をインストール
Getting Started · etsy/phan Wiki
“From Phan.phar” の手順で進める。
% curl -L https://github.com/etsy/phan/releases/download/0.6/phan.phar -o phan.phar;
% mv phan.phar ~/bin
pixiv さんのエントリ を参考に、以下のスクリプトを、パスの通ったところに設置する。
#!/bin/sh
/Users/hikarock/.phpbrew/php/php-7.0.13/bin/php ${PHAN_BIN:-/Users/hikarock/bin/phan.phar} "$@"
php-ast をインストール
phan が依存している php-ast をインストールする。
nikic/php-ast: Extension exposing PHP 7 abstract syntax tree
% git clone git@github.com:nikic/php-ast.git
% cd php-ast
% phpize
% ./configure
% make
% sudo make install
php -i | grep extension_dir
などで extension のインストール先を確認して、該当ディレクトリに ast.so
が配置されていることを確認。
ちなみに以下に配置されていた。
% pwd
/Users/hikarock/.phpbrew/php/php-7.0.13/lib/php/extensions/no-debug-non-zts-20151012
php.ini の [php]
配下に以下を追記して extension を読み込む。php.ini の場所は php --ini
で確認する。
extension = "ast.so"
足りてなかった extension を追加
phan が依存している sqlite3
が足りていなかったので phpbrew で追加する
% phpbrew ext install sqlite3
ここでようやく phan コマンドが正常動作した。
phan -h
.phan/config.php の設置
静的解析を行いたいプロジェクトのディレクトリ直下に .phan/config.php
を作成する。
<?php
return [
// 解析対象のディレクトリ
'directory_list' => [
'lib/'
],
// 解析対象外のディレクトリ
'exclude_analysis_directory_list' => [
'vendor/'
],
];
実行する。
% cd /path/to/project
% phan --progress-bar -ophan.log
大量の解析結果が phan.log
に出力された。めでたしめでたし。