Mercari Engineering Blog

We're the software engineers behind Mercari. Check out our blog to see the tech that powers our marketplace.

PHPStanで始めるPHPのための静的解析 #phperkaigi

こんにちは。最近メルペイに異動になった @hiraku です。

2018年3月10日(土)に、PHPerKaigi 2018というイベントで登壇してきました。「PHPStanで始める継続的静的解析」ということで、メルカリで使用しているPHPStanというツールについて解説しました。

phperkaigi.jp

発表内容を短くまとめると

  • メルカリではPHPStanというツールをCIフローに組み込み、PHPコードの静的解析を行ってコードの信頼性向上に努めています。
  • PHPStanはautoloadファイルを解釈し、一部のコードを実行することで解析の高速化を行っており、よくできています。
  • とはいえ、PHPに対して可能な解析に限界はあるので、テストも合わせて行っていきましょう。
    • 大事なのは、品質向上のアプローチが用意され、心配せずにリリースできることです。

autoloadを認識するということ

スライドの中でも触れていますが、"静的"解析ツールにもかかわらずautoloadを解釈するという機能はかなり画期的です。 autoloadを使わずに静的解析をしようとすると、おそらく全部のプロジェクトファイルを読み込まない限り解析ができません。単発で「src/A/B/C.phpだけチェックしたい」というときもsrc配下とvendor配下全部のファイルを読み込むことになり、非常に時間がかかります。

autoloadベースで読み込むと、不要なファイルは読み込まなくなるため、解析速度が向上します。ちょうど、Makefileが依存関係を辿って、必要な部分だけビルドするようなイメージに近くなります。(Phanというツールはautoloadを解釈しませんが、プロセスを常駐する機能があり、そこで高速化を図っているようです)

プロジェクトがcomposerベースでなくても、独自のオートローダーを書いて読み込ませてもいいですし、何なら全PHPソースをrequire_onceしているファイルを一個作ってオートローダーとして読み込ませても構いません。 設定の柔軟さという意味でも、autoloadは素晴らしいと思います。

今回が初めてのイベントということでしたが、前夜祭から盛り上がっていて、とても気持ちよく話すことが出来ました。

メルカリでは、今でもサーバーサイドロジックの大部分はPHPで動作しています。PHPコードの品質にテストが重要なことに代わりはありませんが、品質向上に使えるツールは積極的に導入し、高速な開発を続けていきたいと思います。

また、PHPを使った大規模プロダクトの開発にご興味のある方のご応募、お待ちしております。