PHPユーザーの皆様、あけましておめでとうございます。本稿ではPHPとHHVMの2つのPHP処理系について紹介します。今後のPHPのトレンドを占うのにお役立ていただければ幸いです。
PHPの現在
本稿執筆時のPHPの最新バージョンは5.6.4です。最近のPHPはマイナーバージョンアップを1年ごとに繰り返すスタイルになっており、PHP 5.6.0はPHP 5.5.0から14ヶ月後の2014年8月にリリースされました。PHP 5.6ではphpdbgという新デバッガが同梱されるようになるなど注目点もありましたが、過去のバージョンアップに比べると変化が小さいバージョンアップでした。
ところで、PHPの次のバージョンアップではメジャーバージョンアップを予定しており、バージョン番号としては7.0となります。メジャーバージョンが5から7へと一気にジャンプするのは珍しい現象ですが、過去に開発中止となったPHP6と混同する恐れがあるというのが最大の理由です。
PHP7は2015年11月リリースを目指しています。とはいえ、スケジュール通りに進むのか、その前にPHP 5.7をリリースするのかなどはまだまだ流動的と言えるでしょう。このPHP7については後ほど紹介します。
HHVMの台頭
さて、読者の方々はPHPソースコードを動かすのにPHPを使っていますか? 当然すぎて質問の意味がわからないと言われそうですが、PHPの処理系はphp.netで配布されているものだけではありません。Javaで記述されたPHP実装のQuercus など、昔から複数の実装が存在します。とはいえ、言語としてPHPを選ぶ人は保守的なせいか、ほかのPHP実装が商用環境に導入されることは滅多にありませんでした。
しかし、Facebookが2012年に発表したHHVM だけは話が別です。HHVMは実用レベルの互換性を持っているうえに本家PHPより高速かつ省メモリで動作するのが特徴で、Facebookで利用されているのはもちろん、ほかの企業でも商用環境で利用する事例が増えてきています。
HHVMが高速な理由の一つとして、JIT(Just In Time)コンパイラの採用が挙げられるでしょう。これはプログラムの実行時にネイティブコードへのコンパイルを行う技術のことです。本家PHPではZend Engineという仮想マシン用のコードを実行しているのですが、この方式はCPUをエミュレートするようなものですから速度面では不利です。同じ処理であれば、JITコンパイルしてCPUのネイティブコードとして実行できたほうが有利になるはずです。
また、HHVMではHack という言語も実行できます。HackはPHPと互換性の高い文法で厳密な型チェックを導入したような言語です。型を厳しく指定したほうがJITでのコンパイル結果を最適化できますから、重いPHPプログラムから順にHack化していくことで更なる性能改善を実現するような狙いだと想像できます。実際に、Facebookでは既に大半のPHPプログラムがHack化されているそうです。
PHPを性能改善するメリット
さて、性能改善それ自体は良いことのはずですが、PHPの処理が速くなって本当に嬉しいのでしょうか。そもそもPHPが主戦場としているWebアプリケーションでは、複雑な処理はリレーショナルデータベース(RDBMS)やキーバリューストア(KVS)といったミドルウェアに任せ、言語側では単純な処理しかしないことが多いように思います。そう考えれば、PHPはWebアプリケーションの記述言語として既に十分な速度と言えなくもありません。
実際、WebアプリケーションではCPU性能よりも先にRDBMS性能がボトルネックになることが多く、PHPが速くなってもメリットが無いこともあります。また、万一CPUがボトルネックになったときでもロードバランシング環境であればWebサーバの台数を増やすだけで解決しますから、小さいシステムではあまりメリットが感じられないかもしれません。
しかし、大規模なシステムでは状況が変わってきます。大規模システムで十分なパフォーマンスチューニングが行われると、各WebサーバのボトルネックがCPUかメモリ消費量かになってきます。Facebookの場合はサーバ台数が10万台オーダーと言われていますから、PHPが速くなってサーバ台数が減らせるなら相当額のコストダウン効果が見込めるわけです。この規模になるとHHVMへの投資費用も回収できるのかもしれません。
もちろん、Facebookの成果に乗っかるだけならFacebookほどの規模は必要ありません。まだ現時点では多少トラブル覚悟での採用になるかもしれませんが、それでも一定以上の規模のサービスではHHVMの導入でコストメリットがあるはずです。実際、現時点で導入事例として紹介されているのは大きなサービスが多いですね。昨今HHVMが注目されていることは、こうした背景から説明できるでしょう。
PHP7での挑戦
ふたたびPHPの話題に戻ります。2014年のはじめ頃にPHPの性能改善プロジェクトPHPNG がスタートしました。リードプログラマはPHPコミッターでありZend Technologies社員でもあるDmitry Stogovです。
Dmitryはその2年くらい前からPHPの性能改善に挑戦しており、特に既存のPHPにJITコンパイラを組み込むことに注力していたようです。ところが、JITコンパイルの導入で単純なベンチマークテストであれば高速になるけれども、実アプリケーションではほとんど差が出ないことがわかりました。詳しく調べてみると実アプリケーションにおいてはメモリの動的確保や配列操作などの処理が総実行時間の30%ほどを占めていたことから、この部分を改善するほうがJITコンパイラでの高速化よりも効果的だと判断したようです。
そうした背景から、PHPNGではPHPプログラム中の変数・文字列・配列などに対応する基本的なデータ構造を大幅に見直し、メモリを動的確保する回数を減らしたり、メモリ消費量を減らすような最適化を行いました。これによりPHPNGは意図した通りの性能アップを果たし、2014年8月にはPHP7のベースプロジェクトとして採用されるまでになりました。現在もPHP7の開発ブランチ上で細かい性能改善が続けられています。
上記グラフはZendCon 2014でのDmitryの発表「PHPNG a New Core for PHP7 」からの引用ですが、WordPressでベンチマークテストしたときにPHP5.6の約1.7倍、HHVMに匹敵する性能となっています。
PHP7の懸念点
このように、PHP7は内部構造のリファクタリングにより過去のバージョンより高速かつ省メモリです。また、普段のマイナーバージョンアップと同様に後方互換性を重視しているため、既存のPHPソースコードは原則修正なしで移行できるはずです。
そう聞くといいことずくめのようですが、一点問題となるのがPHPエクステンションです。PHP7では変数1個に対応するような基本的なデータ構造を変更したため、PHP5用のエクステンションをPHP7で動かすにはコードの修正が必要になります。このことがPHP7への移行の障害になる可能性があるでしょう。
もっとも、PDOやcurlといったPHPに同梱されているエクステンションの多くは既にPHP7対応が済んでおり、付属するテストも通っていますので一定の安心感はあります。しかし、同梱されているエクステンションでもたとえばphpdbgはまだPHP7対応が不十分ですし、その他のPECLエクステンションでは現時点で未対応のものが多いなど、PHP7のリリースに有名エクステンションの対応が間に合うのかはリスクが残る状況だといえます。
まとめ
本稿ではHHVMとPHP7の性能競争の状況について紹介しました。HHVMがJITコンパイルで速度を稼いでいる中で、PHP7はJITコンパイルせずに互角の性能になっているというのは興味深いですね。お互いがまだ性能改善の余地を残しているということかもしれません。
そんなわけで、野次馬的な注目ポイントをまとめると次のようになるでしょうか。
HHVM
先行している利を生かして今後どれだけ利用者を増やせるか
性能面でPHP7を突き放せるのか
PHP7
更なる性能改善ができるのか
そもそも予定通りリリースできるのか
無事リリースできたとしてPHP5からの移行が進むのか
私自身、両者の動向を楽しみに追っていきたいと考えています。