Posted at

HHVM (HipHop Virtual Machine for PHP)/Hack のdocker imageを作成する

More than 3 years have passed since last update.

既存のPHPで作成されたプロダクトをAmazon ECSを利用し、Hack/HHVMへ移行しようと試みています。

上記に先行して、HHVMのdocker imageを作成し、簡単な稼動確認をしてみました。

最終的には、apacheを経由し、FactCGIで動かそう(docker-compose)としていますが、今回は、Hack/HHVMの単独検証です。


HHVMのdockerfileを作成する

公式HPを参照すると、ubuntu、debianとあるので、ベースイメージはubuntuの最新Ver(2016/7/23時点)の15.10を用いる。

インストール手順は、公式を参照の元記載。


dockerfile

FROM ubuntu:15.10

MAINTAINER takeshi.hirosue@bigtreetc.com

RUN apt-get update \
&& apt-get install -y software-properties-common \
&& apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449 \
&& add-apt-repository "deb http://dl.hhvm.com/ubuntu $(lsb_release -sc) main"
RUN apt-get update \
&& apt-get install -y hhvm

ADD scripts/ /scripts/
ADD .hhconfig /app/
RUN chmod 755 /scripts/*.sh \
&& chmod 755 /app/

EXPOSE 9000

CMD ["/scripts/start.sh"]



start.sh

#!/bin/bash

exec hhvm --mode server -d hhvm.server.port=9000 -d hhvm.server.source_root=/app/

参考ソース


docker image作成/起動

docker imageを作成し、9000ポートで起動する

#build

docker build -t hhvm .
#run
docker run -p 9000:9000 -d --name hhvm hhvm


動作確認(PHP)

phpinfoを作成し、コンテナにコピーし、ブラウザで以下URLへ

http://localhost:9000/phpinfo.php

echo '<?php phpinfo(); ?>' >> phpinfo.php

docker cp phpinfo.php hhvm:/app/


動作確認(Hack)

コンテナへ入って、Hackや型検証を試す

docker exec -ti hhvm /bin/bash

以下コンテナ内

#cd app root

$ cd /app/
$ echo '<?hh echo "hello hhvm\n";' >> hello.hh
$ hhvm hello.hh
hello hhvm

以下の検証ファイルを用いて、型検証を試す

参考ソース


  • エラー検証

#run NG

$ hhvm /app/error.hh

Catchable fatal error: Hack type error: Invalid return type at /app/error.hh line 4

#hh_client check NG
$ cd /app/ ; hh_client ; echo $?
error.hh:4:10,29: Invalid return type (Typing[4110])
error.hh:3:15,17: This is an int
error.hh:4:10,29: It is incompatible with a string
2


  • 正常検証

#run OK

$ rm /app/error.hh ; hhvm /app/ok.hh
ok! I am string

#hh_client check OK
$ cd /app/ ; hh_client ; echo $?
No errors!
0

※以下利用したサンプル


ok.hh

<?hh

function h(): string {
return 'ok! I am string';
}
echo h() . "\n";


error.hh

<?hh

function h(): int {
return 'error! I am string';
}
echo h() . "\n";


終わりに

Typecheckerは使えそうですね。

次は、docker-composeを利用して、FastCGIで動かしてみたいと思います。