
ほんの数か月前、HHVM(HipHop Virtual Machine)はPHPコミュニティで人気のバズワードでした。私たちの多くはこの新しい技術、とりわけパフォーマンス向上の報告に好奇心を持っていたのです。FacebookがHHVMを世の中に広める前は、ZendのPHPだけがHHVMに代わる存在でした。
幸いなことに、HHVMはもはやバズワードではありません。私も含め多くの人は大げさな宣伝は嫌いでだと思いますが、かつてのバズワードであったHHVMについて、せっかくなので書いてみようと思います。
では、始めましょう!
この記事で解説するのは次のポイントです。
- HHVMとは何か
- Hackとは何か
- 従来のPHPと何が違うのか
- なぜいま存在しているのか(またはその逆)
- HHVMがPHP 5やPHP 7と異なる点は何か
HHVMとは何か
HHVMとは何かを理解するには、まずZend Engineについて知る必要があります(PHP 7のバージョン3を使っているものとします)。Zend EngineについてはWikipediaの記事が分かりやすいでしょう。
Zend Engineとは、PHPプログラミング言語を解釈するオープンソースのスクリプトエンジンである。イスラエル工科大学テクニオン在学中のアンディ・ガトマンズとゼーブ・スラスキーによって開発された。2人はのちにイスラエルのラマト・ガンにソフトウェア系企業ゼンド・テクノロジーズ(Zend Technologies)を設立。「Zend」という企業名はゼーブ(Zeev)とアンディ(Andi)の名前を組み合わせてつけられた。
Zend Engineは言語でしょうか、それともインタープリター(構文解析プログラム)でしょうか。スクリプト言語をめぐっては、いまだに議論されています。しかし、言語としてのPHPは抽象的で、インタープリターのための青写真と言えます。実際の議論はより哲学的なのです。HHVMはZend Engineに似ていますが、構文解析やソースコードへのアプローチは別物です。
最終的にはZend EngineもHHVMも(理論上は)同じソースコードを実行し、同じ結果・副作用を引き起こします。しかし、HHVMのアプローチは違います。HHVMチームによればHHVMはJIT(ジャストインタイム方式)を使う仮想マシンで、Zendよりもスピードと柔軟性があると説明しています。
HHVMの導入を検討する理由の1つはスピードです。PHP 5までは、HHVMのほうがベンチマークで評価されていました。ベンチマーク自体も賛否両論で意見が分かれますが、きちんと比較できるのであれば、いくつかの真実を示せるでしょう。手短かに言うと、HHVMはPHPよりも優秀に見えましたがPHP 7ほどではない、という印象でした。PHP 7が登場したとき、HHVMとの違いがよく分からなくなったのです。違いをはっきりさせるためにも、この記事でもベンチマークを使った比較に挑戦します。
HHVMはいまでも新しさと魅力があり、Zendとは技術的な観点から見るとまったくの別物です。実験としてインストールして、日常的に使うようになった開発者もいるかもしれません。HHVMはFacebookが開発した技術で、Facebookのサービスに一貫して導入された技術です(どの部分に使われているのかは謎ですが)。Facebookが苦しんだスピード(開発過程で開発者がほとんど遭遇することがない難題がその他にもいくつかありました)を改善するために開発されたのです。
HHVMはHHVMのプログラミング言語であるHackもサポートしています。しかし、HHVMの構文解析の言語はPHPだったはずです。Hackは、基本的にPHPと同じですが、HackにはPHPにはなく、今後追加される見通しもない機能があります。PHPはHHVMが構文を解析して実行できますが、HackでもPHPと同じことができます。どちらを使うかは人それぞれです。しかし、HackはPHPと完全に互換性があるわけではありません。Hackのいくつかの機能はZend Engineでは機能せず、HHVMでしか使えない場合があります。
DockerでHHVMとWordPressを設定する
記事全部を設定の説明に割きたくないので、WP_Dock(WordPress + Docker)を作りました。DockerとWordPressについて詳しく知りたい人は下の記事を読んでください。
- Introduction to Docker for WordPress Developers(WordPress開発者のためのDocker入門)
- How to Manually Build Docker Containers for WordPress(WordPressのDockerコンテナーを手動で作るには)
- How to Use the Official Docker WordPress Image(公式Docker-WordPress画像の使い方)
- Deploying WordPress with Docker(DockerをWordPressに活用するには)
インストール方法は何でも選べますが、Dockerを使うとより簡単です。デスクトップのOSにPHPやHHVM、nginx、MySQLをインストールする必要もなくなります。とはいえ、HHVMのチュートリアルからHHVMとWordPressの両方をインストールしたい場合にどうすべきかは学べます。
Docker Toolboxをダウンロードしておきます。そのあとで、次のプロジェクトをダウンロードまたはコピーします。
git clone https://github.com/AleksanderKoko/WP_Dock wpdock
WordPressをダウンロードし、フォルダーにコピーして「app」と名前をつけます。Dockerのフォルダーcd wpdock/dockerに移動します。
デフォルトではnginxはphp-fpmを実行しているので、変更しなければなりません。docker-compose.ymlでnginxのlinksをhhvmに変更すると次のようになります。
nginx:
build: ./nginx
volumes:
- ./../storage/logs/nginx:/var/log/nginx
- ./../app:/var/www/app
ports:
- "80:80"
- "443:443"
links:
- hhvm
また、docker/nginx/config/upstream.confでphpをhhvmに変更すると、次のようになります。
upstream fastcgi-upstream { server hhvm:9000; }
docker-compose up -d nginxを実行します。これで「docker-compose.yml」を認証として使用するDockerコンテナーができあがります。コンテナーにどちらのIPが含まれているのか調べて、次のステップで使います。
docker-machine ip default
ブラウザーを調べたIPで開くとWordPressのインストールガイドが表示されます。最後のステップとしてWordPressのデータベース認証を変更します。デフォルトの認証情報はdocker-compose.ymlです。MySQLは次のような状態になっています。
mysql:
build: ./mysql
volumes:
- ./../storage/data/mysql:/var/lib/mysql
- ./../storage/logs/mysql:/var/log/mysql
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: databasename
MYSQL_USER: username
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: root
データベース名、ユーザー名、パスワードを変えたい場合は、それぞれの変数を変更します。変更すると、次のようになります。
docker-compose down
docker-compose up -d --build nginx
注意:MySQLのホストは、WordPressのインストールで使用したブラウザーが入っているコンピューターのIPでなければいけません。
PHPから戻るには、まずdocker-compose downを実行して、認証をPHPに戻します。nginxのlinkとしてhhvmを削除し、PHPを追加します。docker/nginx/configuration/upstream.confを次のように更新してください。
upstream fastcgi-upstream { server php:9000; }
docker-compose up -d --build nginxを実行し、代わりにPHPを使います。
HHVM + WordPress 対 PHP 7 + WordPress
ベンチマークにはベースコンテナーをそのまま使うというルールがあります。HHVMもそのまま単体で使えますが、記事では比較のためfpmを使います。両方とも最適化できますが、後日解説します。HHVMがその実力を余すことなく発揮するには準備が必要で、最初にいくつかのリクエストを行う必要があります(公平を期するため、PHPも同じようにします)。ベンチマークにはApache Bench(ab)を使います。自分のコンピューターでベンチマークを実行したい場合、ドキュメントからインストール手順や使い方を確認してください。また、Bruno Skvorcが執筆した記事『Stress-test your PHP App with ApacheBench』もとても参考になります。
記事で使うベンチコマンドはab -500-c 100 http://192.168.99.100です。合計で500件のリクエストと100件の同時リクエストがあります。
PHPの結果
HHVMの結果
79秒と18秒とでは大きな差です。ただ、PHP、HHVMのどちらも最適化していません。HHVMはそのままで速いのかもしれませんが、いつもそうだとは限らないので注意してください。実際にはPHP 7のほうがHHVMより高速かもしれないからです。
最後に知っておきたいこと
HHVMは優秀な技術のように思えます(だからこそDockerと組み合わせたのです)。しかし、それでも注意して使う必要があります。Zend Engineは老舗で場数を重ねてきたツールであり、PHPも一般的にはツールとして成熟していて、名声も得ています。だからといって実験の余地がないわけではありません。また、問題はそれだけではありません。WordPressにはHHVMでは機能しないプラグインやテーマがたくさんあります。PHP用に作られており、HHVMはPHPと100%の互換性を持つわけではないからです。
最後に
記事ではHHMVとは何か、そしてWordPressとHHVMを設定する方法について解説しました。
HHVMは、オープンソースというだけではなく、Facebookが前向きに取り組んでいることからも、今後注目すべきだと分かります。あらゆる言語がサーバー側に密集するWeb新時代には多くの競争が勃発します。フラグメント化を促すにはなくてはならないものではありませんが、新時代のシーン全体を多様化し、革新するでしょう。
PHPそのものはJava、Ruby on Rails、Laravelから多くのことを取り入れています。技術としてクールで、速く、新しいアプローチかを除いて、HHVMのチームはより良いサービス構築のためZend Engineと凌ぎを削っています。PHP 7はPHPコミュニティでは最高のアップデートの1つでした。PHPそのものがZendと合体したことを受け、他の企業が競争に乗り出したのは良い兆候です。また、HHVMが単なる競合仮想マシンではないと知る人もいます。たとえば、Tagua VMはRustを使って書かれた新しい仮想マシンです。アプローチも記憶装置を安全に保つことを目的としており、他とは異なります。
(原文:Getting Started with HHVM and WordPress)
[翻訳:加藤由佳]
[編集:Livit]
