hhvm
hhvm (HipHop Virtual Machine) とは、Facebook が開発した PHP の処理系です。本家のPHPの処理系よりも高速にd黄砂する、といった利点があります。PHP7では、内部構造の見直しが進み、hhvmに引けを取らないスピードへ進化しています。
読み方
- hhvm
- えいち えいち ぶい えむ
- HipHop Virtual Machine
- ひっぷほっぷ ばーちゃる ましん
目次
概要
hhvm は、Facebook が開発した OSS の PHPの処理系です。 hhvmは、 「PHP を高速処理すること」を目的にしています。PHPをhhvmのHHBCというバイトコードに変換し、中間表現 HHIR に変換し、最適化を行い、x86-64 などのマシンコードに Just-In-Timeコンパイルします。
hhvmは、Facebookの開発したPHP互換プログラミング言語 Hack の実行環境としても利用できます。
hhvmは、優秀な監視ツールが用意されています。ボトルネックを見つけ、不要な動作を簡単に特定できます。
HHVMはなぜ高速なのか
PHPは、動的なインタプリタ言語です。hhvmは、JITコンパイラ(Just-In-Time Compiler)を利用して、コードをコンパイラして最適化します。この最適化によって、通常のPHPの処理系よりも高いパフォーマンスで処理を実行できるようになります。PHPの方は、動的な型の言語であるが、実際のプログラムでは、型はそこまで動的ではない、ということに基づいて、hhvmのJITコンパイラが実装されています。実際には、PHPのプログラムの型を見て、それらに最適なコードを出力します。
PHPの今後
PHP7では、内部構造の見直しにより、5.6系よりも大幅に高速化され、hhvmにそのスピードが迫ってきています。PHP7では、JITコンパイラが実装されていません。JITコンパイラを含む、いろいろな改善が進めば、hhvmを肩を並べることができるかもしれません。
ウィキペディアの高速化で利用されたHHVM
ウィキペディアは、PHPで実装されたMediaWikiを利用しています。ウィキペディアでは、プロキシサーバとしては有名なSquidを利用して、高速化を過去に行っています。しかし、キャッシュサーバでは、すべてのユーザのニーズを答えられません。アプリケーションサーバが必要なときもあります。そのため、PHPの処理を高速化する必要がありました。
PHPの処理が高速なhhvmを利用することで、スピードアップを図ることができました。
アプリケーションサーバの負荷は、50%から10%へと劇的に低下しました。
HHVM 3.5.0
- PDO エクステンションのエラーハンドリングの改善
- ビルド時間の短縮
- エクステンションの導入
- クロージャをインラインで呼び出すための拡張
- 非同期ストリームをブロックするための stream_await を導入
HHVM 3.6.0
- Hackの非同期機能のMySQLのAsyncMySQLがサポートされました。
- memcached 実装拡張のプロトコルルーター MCRouter がデフォルトで有効になりました。
- curl 非同期処理を利用し、アプリケーションの並列化が可能です。
HHVM 3.9.0
- 型チェックやランタイムが改善されました。
- リクエスト間のプーリング curl ハンドルの新しいファシリティを含むランタイムの改善
lxc 環境を構築する
sudo lxc-create -t ubuntu -n hhvm sudo lxc-start --name=hhvm
インストール
おそらく不要になった手順
2018年現在では、WSLのUbuntuの環境に hhvm を簡単に入れられました。 おそらくこの手順はもう不要になったのでしょう。
wget をまずインストールします。
sudo apt install wget
リポジトリにGPG鍵をインポートします。
wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add -
リポジトリをパッケージ管理システムに登録します。
echo deb http://dl.hhvm.com/ubuntu trusty main | sudo tee /etc/apt/sources.list.d/hhvm.list
例では、 trusty を選択しています。 http://dl.hhvm.com/ubuntu でリポジトリの新しいのを選択します。古いリポジトリは、依存関係を解決できず、hhvm をインストールできません。
hhvmのインストール
最近の Ubuntu ならここからで大丈夫でしょう。
hhvm パッケージをインストールします。
sudo apt update sudo apt install hhvm
hhvm 3.5.0 自体のインストールログ
hhvm (3.5.0~trusty) を設定しています ... update-alternatives: /usr/bin/php (php) を提供するために 自動モード で /usr/bin/hhvm を使います ******************************************************************** * HHVM is installed. * * Running PHP web scripts with HHVM is done by having your webserver talk to HHVM * over FastCGI. Install nginx or Apache, and then: * $ sudo /usr/share/hhvm/install_fastcgi.sh * $ sudo /etc/init.d/hhvm restart * (if using nginx) $ sudo /etc/init.d/nginx restart * (if using apache) $ sudo /etc/init.d/apache restart * * Detailed FastCGI directions are online at: * https://github.com/facebook/hhvm/wiki/FastCGI * * If you're using HHVM to run web scripts, you probably want it to start at boot: * $ sudo update-rc.d hhvm defaults * * Running command-line scripts with HHVM requires no special setup: * $ hhvm whatever.php * * You can use HHVM for /usr/bin/php even if you have php-cli installed: * $ sudo /usr/bin/update-alternatives --install /usr/bin/php php /usr/bin/hhvm 60 ******************************************************************** libpaper-utils (1.1.24+nmu2ubuntu3) を設定しています ... Processing triggers for libc-bin (2.19-0ubuntu6.5) ... Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
使い方
バージョン
ubuntu@hhvm:~$ hhvm --version HipHop VM 3.5.0 (rel) Compiler: tags/HHVM-3.5.0-0-ga90f4733cfa0d8fefdafc7433f758f78cdc75424 Repo schema: b88b6fee8ef78ab638506d212abcbefe74a276ac
コマンドラインオプション
ubuntu@hhvm:~$ hhvm --help Usage: hhvm [-m <mode>] [<options>] [<arg1>] [<arg2>] ... Options: --help display this message --version display version number --php emulate the standard php command line --compiler-id display the git hash for the compiler --repo-schema display the repository schema id -m [ --mode ] arg (=run) run | debug (d) | server (s) | daemon | replay | translate (t) -a [ --interactive ] Shortcut for --mode debug -c [ --config ] arg load specified config file -v [ --config-value ] arg individual configuration string in a format of name=value, where name can be any valid configuration for a config file -d [ --define ] arg define an ini setting in the same format ( foo[=bar] ) as provided in a .ini file --no-config don't use the default php.ini -p [ --port ] arg (=-1) start an HTTP server at specified port --port-fd arg (=-1) use specified fd instead of creating a socket --ssl-port-fd arg (=-1) use specified fd for SSL instead of creating a socket --admin-port arg (=-1) start admin listener at specified port --debug-config arg load specified debugger config file -h [ --debug-host ] [=arg(=localhost)] connect to debugger server at specified address --debug-port arg (=-1) connect to debugger server at specified port --debug-extension arg PHP file that extends command 'arg' --debug-cmd arg executes this debugger command and returns its output in stdout --debug-sandbox arg (=default) initial sandbox to attach to when debugger is started -u [ --user ] arg run server under this user account -f [ --file ] arg execute specified file -l [ --lint ] arg lint specified file -w [ --show ] arg output specified file and do nothing else --temp-file file specified is temporary and removed after execution --count arg (=1) how many times to repeat execution --no-safe-access-check arg (=0) whether to ignore safe file access check --arg arg arguments --extra-header arg extra-header to add to log lines --build-id arg unique identifier of compiled server code --instance-id arg unique identifier of server instance --xhprof-flags arg (=0) Set XHProf flags
動作確認
ubuntu@hhvm:~$ echo '<?php echo "Hello HHVM", PHP_EOL;?>' >/tmp/hello.php ubuntu@hhvm:~$ hhvm /tmp/hello.php Hello HHVM
サーバモードで起動する
phpのビルドインサーバの用にhhvmも同じように、ビルドインサーバが使えます。単体で動かせるので便利です。
$ hhvm -m server -p 8080 -d hhvm.server.source_root=./
lxc 環境を削除する
$ sudo lxc-stop --name=hhvm $ sudo lxc-destroy --name=hhvm
HHVMのインストールに失敗した話
純粋に依存関係が解決できなかったため、hhvmがインストールできませんでした。
$ sudo apt install hhvm パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 インストールすることができないパッケージがありました。おそらく、あり得 ない状況を要求したか、(不安定版ディストリビューションを使用しているの であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移 動されていないことが考えられます。 以下の情報がこの問題を解決するために役立つかもしれません: 以下のパッケージには満たせない依存関係があります: hhvm : 依存: libboost-filesystem1.54.0 しかし、インストールすることができません 依存: libboost-program-options1.54.0 しかし、インストールすることができません 依存: libboost-system1.54.0 しかし、インストールすることができません 依存: libboost-system1.54.0 しかし、インストールすることができません 依存: libboost-regex1.54.0 しかし、インストールすることができません 依存: libgcrypt11 しかし、インストールすることができません 依存: libgnutls26 しかし、インストールすることができません 依存: libmemcached10 しかし、インストールすることができません 依存: librtmp0 しかし、インストールすることができません 依存: libboost-thread1.54.0 しかし、インストールすることができません 依存: libboost-context1.54.0 しかし、インストールすることができません 依存: libmagickwand5 しかし、インストールすることができません E: 問題を解決することができません。壊れた変更禁止パッケージがあります。 [1] 6009 exit 100 sudo apt install hhvm $ sudo apt-cache search libboost-filesystem libboost-filesystem-dev - filesystem operations (portable paths, iteration over directories, etc) in C++ (default version) libboost-filesystem1.55-dev - filesystem operations (portable paths, iteration over directories, etc) in C++ libboost-filesystem1.55.0 - filesystem operations (portable paths, iteration over directories, etc) in C++
関連項目
ツイート