HHVMの導入
HHVM(HipHop Virtual Machine)は、米フェイスブックが開発するPHP互換となる処理系の一つです。HHVMの特徴は、なんと言ってもその速さにあり、PHPのOPCacheやAPCuに相当するHHBCと呼ばれる中間コードのキャッシュ機能に加え、さらにJITコンパイル機能を搭載し、非常に高いパフォーマンスを実現しています。
PHPのOPCacheやAPCu、HHVMのHHBCは、中間コードをキャッシュし、インタープリタによる変換コストを省略するものですが、HHVMのJITコンパイル機能は、これをさらに一歩推し進め、頻繁に実行されるコードを中間コードから機械語への変換とメモリ上へのキャッシュを行い、CPUが直接実行可能な機械語による処理とするものです。
PHP 5やPHP 7が、中間コードへの一段階の変換処理のみであるのに対し、HHVMは、中間コードへの変換とJITコンパイルという二段階の変換処理が実行されることになります。また、一定回数未満においては、JITコンパイル処理はなされません。
この二段階の変換処理は、パフォーマンス面にもあらわれます。初回のアクセスは、PHP 5やPHP 7よりもパフォーマンスは上がりませんが、中間コードがキャッシュされるとパフォーマンスも改善し、さらに、JITコンパイルの対象となる規定実行回数に達し、コンパイル処理が完了した後は、非常に高速に動作するようになります。この特性は、運用時には問題はなりませんが、HHVMの初回起動時や再起動時は、注意が必要となります。
また、HHVMはPHP 5やPHP 7との高い互換性を有しています。通常は、PHP 5互換のモードで動作していますが、設定ファイルにhhvm.php7.all = 1の設定を行うことによって、PHP 7モードでの動作にも変更可能となっています。ただし、すべての機能やモジュールに完全な互換性があるわけではなく、特にテーマやプラグインによっては互換性を確保するための修正が必要なものがあります。運用では、このことも念頭に置いておいて、十分な検証を行うようにしてください。
HHVMの導入については、GitHub内Facebook/HHVMコミュニティのWikiに記載されている「Building and installing hhvm on CentOS 7.x」を参考に、RPMパッケージからHHVM 3.12のインストールを行います。今回インストールするHHVM 3.12は、RemiリポジトリからインストールしたPHP 5.6やPHP 7との共存が可能です。
まず、HHVMのインストールに必要なパッケージを先にそろえます。
[root@CodeZine-CentOS ~]# yum install cpp gcc-c++ cmake git psmisc {binutils,boost,jemalloc,numactl,ImageMagick,sqlite,tbb,bzip2,openldap,readline,elfutils-libelf,gmp,lz4,pcre}-devel lib{xslt,event,yaml,vpx,png,zip,icu,mcrypt,memcached,cap,dwarf}-devel {unixODBC,expat,mariadb}-devel lib{edit,curl,xml2,xslt}-devel glog-devel oniguruma-devel ocaml gperf enca libjpeg-turbo-devel openssl-devel mariadb mariadb-server {fribidi,libc-client}-devel make -y [root@CodeZine-CentOS ~]# yum install inotify-tools -y [root@CodeZine-CentOS ~]# yum install http://mirrors.linuxeye.com/hhvm-repo/7/x86_64/hhvm-3.12.1-1.el7.centos.x86_64.rpm [root@CodeZine-CentOS ~]# /usr/local/bin/hhvm --version HipHop VM 3.12.1 (rel) Compiler: tags/HHVM-3.12.1-0-gf516f1bb9046218f89885a220354c19dda6d8f4d Repo schema: f2e5f39b2ad4a08bcbd90b5d8bcb580f40fba6c8
サービスの設定を変更し、設定ファイルで指定した待ち受けポートを使用するようにします。
[root@CodeZine-CentOS ~]# sed 's/-vServer.Port=9001//' /usr/lib/systemd/system/hhvm.service [Unit] Description=HHVM HipHop Virtual Machine (FCGI) [Service] ExecStart=/usr/local/bin/hhvm --config /etc/hhvm/server.ini --user nginx --mode daemon -vServer.Type=fastcgi [Install] WantedBy=multi-user.target [root@CodeZine-CentOS ~]# sed -i 's/-vServer.Port=9001//' /usr/lib/systemd/system/hhvm.service
/etc/hhvm/server.iniで、待ち受けポート(hhvm.server.port)を9000に変更します。
[root@CodeZine-CentOS ~]# sed -I 's/hhvm.server.port = 9001/hhvm.server.port = 9000/' /etc/hhvm/server.ini [root@CodeZine-CentOS ~]# systemctl daemon-reload [root@CodeZine-CentOS ~]# systemctl start hhvm