Ubuntu Weekly Recipe

第318回 HackとPHPの実行環境HHVMをLXCで試す

この記事を読むのに必要な時間:およそ 3.5 分

HTTPサーバーの準備

HTTPサーバーをインストールして,Webブラウザ越しにアクセスしてみます。

まず,Webブラウザからのアクセスを簡便にするため,RFC 6762のMulticast DNSを使い,ローカルエリアネットワークで名前解決できるようにします。avahi-daemonパッケージをインストールします。

$ sudo apt-get install avahi-daemon

hhvmは今のところ,ApacheとNginx上でFastCGIインターフェース越しにアクセスすることができます。今回はapache2パッケージを使います。以下のようにインストールします。

$ sudo apt-get install apache2

hhvmをインストールしたときの出力を参考に,以下のスクリプトを実行します。

$ sudo /usr/share/hhvm/install_fastcgi.sh

最後に,hhvmサーバーを再起動します。

$ sudo service hhvm restart

これでHTTPサーバーの準備完了です。ドキュメントルートに以下のPHPスクリプトを置きます。

リスト1 /var/www/hello.php

<?php
header("Content-Type: text/plain; charset=UTF-8");
echo "hello hhvm\n";

ホストでWebブラウザを起動し,⁠http://saucy.local/hello.php」にアクセスします。HTTPレスポンスが出力されていることがわかります。

図1 左がLXCコンテナで開いたエディタの表示,右がFirefoxでHTTPリクエストした際の表示

図1 左がLXCコンテナで開いたエディタの表示,右がFirefoxでHTTPリクエストした際の表示

Hack言語の使用

Hack言語はPHPとシームレスに相互運用可能な言語として開発されました。そのため,PHP(言語)と非常によく似ています。Hackのリファレンスには,現在のPHPコードベースとの互換性レベルを維持しつつ,PHPよりも読みやすく,安全で,リファクタリング可能なコードを提供することがHackのゴールだということです。

Hack Language ReferenceのType AnnotationsからAnnotating Arraysのサンプルを試します。今回のレシピの目的は試すことにあるので言語の詳細については割愛します。

リスト2 Annotating Arraysのサンプル(/tmp/array.hh)

<?hh

class FooFoo {}
class HackArrayAnnotations {
  private array<FooFoo> $arr;
  private array<string, FooFoo> $arr2;

  public function __construct() {
    $this->arr = array();
    $this->arr2 = array();
  }

  public function bar<T>(T $val): array<T> {
    return array($val);
  }

  public function sort(array<int, float> $a): array<int, float> {
    sort($a);
    return $a;
  }

  public function baz(FooFoo $val): array<FooFoo> {
    $this->arr[] = $val;
    return $this->arr;
  }
}

function main_aa() {
  $haa = new HackArrayAnnotations();
  var_dump($haa->bar(3));
  var_dump($haa->bar(new FooFoo()));
  var_dump($haa->sort(array(1.3, 5.6, 2.3, 0.2, 1.4)));
  var_dump($haa->baz(new FooFoo()));
}

main_aa();

以上を適当なファイルに保存して,hhvmで実行します。

$ hhvm /tmp/array.hh
array(1) {
  [0]=>
  int(3)
}
array(1) {
  [0]=>
  object(FooFoo)#2 (0) {
  }
}
array(5) {
  [0]=>
  float(0.2)
  [1]=>
  float(1.3)
  [2]=>
  float(1.4)
  [3]=>
  float(2.3)
  [4]=>
  float(5.6)
}
array(1) {
  [0]=>
  object(FooFoo)#2 (0) {
  }
}

コンテナの終了と削除

コンテナを終了するには別な端末を開き,以下のコマンドを実行します。

$ sudo lxc-stop --name=saucy

コンテナを削除するには以下のコマンドを実行します。

$ sudo lxc-destroy --name=saucy

著者プロフィール

坂本貴史(さかもとたかし)

Ubuntuのマルチメディア編集環境であるUbuntu Studioのユーザ。主にUbuntu日本コミュニティとUbuntu Studioコミュニティで活動。いつかユーザ同士で合作するのが夢。