こんにちは。よっしーです(^^)
今日は、dockerで構築した開発環境において、phanを導入した手順をご紹介します。
実行環境
この記事は、特定の開発環境を前提として書かれています。もし興味がある場合は、その開発環境を構築するための説明が書かれている記事を参考にしてください。該当記事は下記になります。
ただ、この記事で紹介している修正内容がたくさんあるので、その修正を反映した最新版のプログラムをダウンロードして、参照することをおすすめします。該当のプログラムの詳細については、下記のページで確認できます。
背景
Phanを導入する主な背景として、以下のような理由が挙げられます。
- コード品質の向上: Phanは、PHPコードの静的解析を行うためのツールであり、コードの品質を向上することができます。Phanは、様々な静的解析ルールを提供しており、コード内の問題や潜在的なエラーを検出することができます。これにより、コードの品質を向上させることができます。
- バグの早期発見: Phanは、コードの静的解析を行うため、実行時エラーを事前に検出することができます。これにより、バグの早期発見が可能になり、修正することができます。また、Phanは、コードの変更によって発生する可能性のある問題を検出することもできます。
- リファクタリングのサポート: Phanは、コードの静的解析により、不要なコードや未使用の変数など、リファクタリングの対象となる箇所を検出することができます。これにより、コードの保守性を向上させることができます。
- テストのサポート: Phanは、静的解析を行うことにより、コードのカバレッジ情報を提供することができます。これにより、テストの作成や改善が容易になり、テストの品質を向上させることができます。
Phanは、PHPコードの品質向上やバグの早期発見、リファクタリングのサポート、テストのサポートなど、開発プロセスを改善するために有用なツールの1つです。
ディレクトリ構造
ディレクトリ構造は下記のようになっています。赤字の箇所が新規&更新、削除になります。
.
├── LICENSE
├── Makefile
├── README.md
└── app
├── apache-exporter
├── compose.yml
├── flyway
├── grafana
├── influxdb
├── k6
├── memcached
├── memcached-exporter
├── nginx
├── nginx-exporter
├── phan
│ ├── .gitignore
│ ├── .phan
│ │ └── config.php
│ ├── Dockerfile
│ └── log
│ └── .gitkeep
├── php-fpm
├── php-fpm-exporter
├── mongo
├── mysql
├── mysqld-exporter
├── prometheus
├── redis
├── redis-exporter
├── schemaspy
├── web
└── xhgui
compose.yml
下記の内容をファイル(compose.yml) 318-327 行目に追加します。
phan-cmd:
build: ./phan
container_name: phan
volumes:
- ./php-fpm/CodeIgniter-3.1.13/application:/mnt/src/app
- ./phan/.phan/config.php:/mnt/src/.phan/config.php
- ./phan/log:/mnt/log
profiles:
- phan
phan/Dockerfile
下記の内容で新規ファイル(phan/Dockerfile) を作成します。
FROM phanphp/phan:latest
phan/.phan/config.php
下記の内容で新規ファイル(pphan/.phan/config.php) を作成します。
<?php
return [
'directory_list' => [
'./app'
],
'backward_compatibility_checks' => true,
'ignore_undeclared_functions_with_known_signatures' => false,
'whitelist_issue_types' => [
'PhanCompatiblePHP7', // 変更された可能性のある構文チェック
'PhanDeprecatedFunctionInternal', // 7.0以降で非推奨になった関数
'PhanUndeclaredFunction', // PHP5.xで非推奨になり、PHP7.0で削除された関数
],
'plugins' => ['InvokePHPNativeSyntaxCheckPlugin'],
];
phan/log/.gitkeep
空で新規ファイル(phan/log/.gitkeep) を作成します。
Makefile
下記の内容をファイル(Makefile) 4 行目に追加します。
RUN_DATETIME = $(shell date "+%Y%m%d_%H%M%S")
下記の内容をファイル(Makefile) 72-77 行目に追加します。
.PHONY: run_phan
run_phan:
cd $(WOKR_DIR) \
&& docker compose run --rm phan-cmd -po /mnt/log/analysis_$(RUN_DATETIME).log
動作確認
下記のコマンドを実行して、サービスを起動します。
make run_phan
下記のファイルができていることを確認します。
app/phan/log/analysis_(実行日時).log
ただ、makeコマンドを実行すると下記のようにエラーが表示されますが、原因解明には至っていないです。気になる方は、docker compose コマンドを実行してもらえればと思います。makeコマンドで実行した結果とdocker compose コマンドで実行した結果は同じでした。
% make run_phan
cd ./app \
&& docker compose run --rm phan-cmd -po /mnt/log/analysis_20230430_231212.log
analyze ████████████████████████████████████████████████████████████ 100.0% 241MB/241MB
make: *** [run_phan] Error 1
解説
phanについて
Phanは、PHPの静的コード解析ツールの一つで、コードの品質やセキュリティを向上させるために使用されます。Phanは、PHP 7.4以上のバージョンをサポートしており、PHPの静的型付け機能を活用してコードの解析を行います。
Phanを使用すると、次のようなことができます。
- エラーや警告を検出
Phanは、コードに潜むエラーや警告を検出することができます。例えば、未定義の変数や関数の使用、無効な関数呼び出し、未使用の変数、重複した関数の定義などがあります。
- コードの品質を向上
Phanは、コードの品質を向上するための静的解析を行います。例えば、コードのリファクタリングが必要な箇所を特定したり、より分かりやすく、メンテナンス性の高いコードを書くためのアドバイスを提供します。
- セキュリティの向上
Phanは、セキュリティの脆弱性を検出するための静的解析も行います。例えば、SQLインジェクションやXSS(クロスサイトスクリプティング)攻撃の潜在的なリスクを特定することができます。
Phanは、Composerを使用してインストールすることができます。また、Phanは、プロジェクトに応じて設定ファイルをカスタマイズすることができるため、独自のルールや検査項目を追加することもできます。
phan/.phan/config.php
<?php
return [
'directory_list' => [
'./app'
],
'backward_compatibility_checks' => true,
'ignore_undeclared_functions_with_known_signatures' => false,
'whitelist_issue_types' => [
'PhanCompatiblePHP7', // 変更された可能性のある構文チェック
'PhanDeprecatedFunctionInternal', // 7.0以降で非推奨になった関数
'PhanUndeclaredFunction', // PHP5.xで非推奨になり、PHP7.0で削除された関数
],
'plugins' => ['InvokePHPNativeSyntaxCheckPlugin'],
];
以下に、各設定項目について説明します。
- ‘directory_list’ => [‘./app’]
- Phanが検査するディレクトリを指定しています。
- この場合は、’./app’ディレクトリ以下のPHPファイルを検査対象としています。
- ‘backward_compatibility_checks’ => true
- この設定が有効になっている場合、PhanはPHPのバージョンアップに伴う互換性の問題を検査します。
- ‘ignore_undeclared_functions_with_known_signatures’ => false
- この設定が有効になっている場合、Phanは未定義の関数を無視します。
- しかし、この設定がfalseになっている場合、Phanは未定義の関数をエラーとして報告します。
- ‘whitelist_issue_types’ => [ ‘PhanCompatiblePHP7’, ‘PhanDeprecatedFunctionInternal’, ‘PhanUndeclaredFunction’, ]
- Phanが報告する問題の種類を制限する設定です。
- この場合は、Phanが報告する問題の中から、変更された可能性のある構文チェック、7.0以降で非推奨になった関数、PHP5.xで非推奨になり、PHP7.0で削除された関数のみを報告します。
- ‘plugins’ => [‘InvokePHPNativeSyntaxCheckPlugin’]
- Phanの拡張機能であるInvokePHPNativeSyntaxCheckPluginを有効にする設定です。
- このプラグインは、PHPの構文チェックを行うために、PHPのインタプリタを呼び出します。
以上が、Phanの設定ファイルの例である、この設定の主な機能の説明になります。
おわりに
今日は、dockerで構築した開発環境にphanを導入しました。ぜひ、品質向上等に使用してみてください。
今回使用したファイルは下記のGitHubにタグ付けしています。
もし、質問等あればコメントください。確認後、ご連絡いたします。随時、エンジニア案件も相談可能ですので、よろしくお願いいたします。
また明日お会いしましょう!
コメント