「hhvm」の版間の差分

提供: Ubuntu入門
移動: 案内検索
(関連項目)
 
(同じ利用者による、間の2版が非表示)
行1: 行1:
[[hhvm]] (HipHop Virtual Machine) とは、Facebook が開発した PHP の処理系です。
+
[[hhvm]] (HipHop Virtual Machine) とは、Facebook が開発した PHP の処理系です。本家のPHPの処理系よりも高速にd黄砂する、といった利点があります。PHP7では、内部構造の見直しが進み、[[hhvm]]に引けを取らないスピードへ進化しています。
  
 
'''読み方'''
 
'''読み方'''
行9: 行9:
 
== 概要 ==
 
== 概要 ==
 
[[hhvm]] は、Facebook が開発した OSS の PHPの処理系です。 [[hhvm]]は、 「PHP を高速処理すること」を目的にしています。PHPを[[hhvm]]のHHBCというバイトコードに変換し、中間表現 HHIR に変換し、最適化を行い、x86-64 などのマシンコードに Just-In-Timeコンパイルします。
 
[[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 ==
 
== HHVM 3.5.0 ==
 
* PDO エクステンションのエラーハンドリングの改善
 
* PDO エクステンションのエラーハンドリングの改善
行15: 行29:
 
* クロージャをインラインで呼び出すための拡張
 
* クロージャをインラインで呼び出すための拡張
 
* 非同期ストリームをブロックするための stream_await を導入
 
* 非同期ストリームをブロックするための stream_await を導入
 +
== HHVM 3.6.0 ==
 +
* Hackの非同期機能のMySQLのAsyncMySQLがサポートされました。
 +
* memcached 実装拡張のプロトコルルーター MCRouter がデフォルトで有効になりました。
 +
* curl 非同期処理を利用し、アプリケーションの並列化が可能です。
 +
== HHVM 3.9.0 ==
 +
* 型チェックやランタイムが改善されました。
 +
* リクエスト間のプーリング curl ハンドルの新しいファシリティを含むランタイムの改善
 
== lxc 環境を構築する ==
 
== lxc 環境を構築する ==
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
行20: 行41:
 
sudo lxc-start --name=hhvm
 
sudo lxc-start --name=hhvm
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
== インストール ==
 
== インストール ==
 +
=== おそらく不要になった手順 ===
 +
2018年現在では、WSLのUbuntuの環境に [[hhvm]] を簡単に入れられました。
 +
おそらくこの手順はもう不要になったのでしょう。
 +
 
wget をまずインストールします。
 
wget をまずインストールします。
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
行40: 行64:
 
http://dl.hhvm.com/ubuntu
 
http://dl.hhvm.com/ubuntu
 
でリポジトリの新しいのを選択します。古いリポジトリは、依存関係を解決できず、hhvm をインストールできません。
 
でリポジトリの新しいのを選択します。古いリポジトリは、依存関係を解決できず、hhvm をインストールできません。
 +
=== hhvmのインストール ===
 +
最近の Ubuntu ならここからで大丈夫でしょう。
  
 
hhvm パッケージをインストールします。
 
hhvm パッケージをインストールします。
行46: 行72:
 
sudo apt install hhvm
 
sudo apt install hhvm
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
=== hhvm 3.5.0 自体のインストールログ ===
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
hhvm (3.5.0~trusty) を設定しています ...
 
hhvm (3.5.0~trusty) を設定しています ...
行149: 行175:
 
ubuntu@hhvm:~$ hhvm /tmp/hello.php
 
ubuntu@hhvm:~$ hhvm /tmp/hello.php
 
Hello HHVM
 
Hello HHVM
 +
</syntaxhighlight>
 +
=== サーバモードで起動する ===
 +
phpのビルドインサーバの用に[[hhvm]]も同じように、ビルドインサーバが使えます。単体で動かせるので便利です。
 +
<syntaxhighlight lang="bash">
 +
$ hhvm -m server -p 8080 -d hhvm.server.source_root=./
 
</syntaxhighlight>
 
</syntaxhighlight>
 
== lxc 環境を削除する ==
 
== lxc 環境を削除する ==
行155: 行186:
 
$ sudo lxc-destroy --name=hhvm
 
$ sudo lxc-destroy --name=hhvm
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
== HHVMのインストールに失敗した話 ==
 +
純粋に依存関係が解決できなかったため、[[hhvm]]がインストールできませんでした。
 +
<syntaxhighlight lang="bash">
 +
$ 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++
 +
</syntaxhighlight>
 
== 関連項目 ==
 
== 関連項目 ==
 
* [[メインページ]]
 
* [[メインページ]]
 
<!-- vim: fileencoding=utf-8 filetype=mediawiki
 
<!-- vim: fileencoding=utf-8 filetype=mediawiki
 
-->
 
-->

2018年4月25日 (水) 23:15時点における最新版

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

関連項目