hhvm

提供: Ubuntu入門
移動: 案内検索
スポンサーリンク

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++

関連項目




スポンサーリンク