PHP7ではなく
Hack/HHVMを選ぶ理由
株式会社インテリジェンス
大谷 祐司
1
2016/02/24
2
・山口県下関出身の35歳
・インテリジェンスの新規事業で技術責任者。
・車とプログラミングを愛しています。
・Facebookの友達申請は気軽にぜひ!
https://www.facebook.com/yuji.otani.16
自己紹介
3
5年 7年
1年
→ →
メイン開発言語の経歴
4
質問①
Hack/HHVMを使ったことがあるかた
5
質問②
PHP7が出たけど、これから
何を使おうか迷っているかた
6
本日の目的
Hack/HHVMの素晴らしさを伝えて
今後の選択肢にしてもらいたい。
7
インテリジェンスでは
2015年から複数のプロジェクトで
Hack/HHVMを導入しています。
(フレームワークはFuelPHP)
8
転職サイト MIIDAS
9
社員紹介サービス MyRefer
10
・Facebookによって開発された言語
・PHPと互換性を持っている
・HHVMという仮想マシン上で動作する
・言語仕様はPHP5.6がベース
Hackとは?
・バグのないコードを迅速に書けるようになる
・エンジニアがコーディング体験を楽しめる
・「高速な動作」「大規模開発向きの仕様」
Hackの目指すところ
http://growthhackjapan.com/2014-03-23-facebook-hack-released-to-the-public/
12
・PHPのノウハウを生かしながら、新しいこと
にチャレンジしたい。
・パフォーマンスが良いサービスにしたい。
・将来的に大規模になった時にも可読性がよく、
スピーディーな改修ができるようにしたい。
・PHP7がまだリリースされないので。
Hackの採用理由
13
昨年末、大きな事件が起きました
14
2015/12/03
PHP7リリース!!
15
大幅な高速化を実現!!
http://talks.php.net/fluent15#/wpbench
16
・Null合体演算子(??)
・致命的エラーを補足可能(EngineException)
・無名クラスの導入。
・スカラ型のタイプヒンティング。
・返り値のタイプヒンティング。
新しい言語仕様
17
・64bitCPUに最適化されたデータ構造。
・CPUキャッシュを有効活用する改善。
・配列はメモリ上でも配列になった。
(PHP5は全て連想配列)
・配列のメモリ使用量が劇的に下がった。
※PHP5(72bytes)→PHP7(32bytes)
データ構造の変更
18
Hack/HHVMの特徴がいくつも、
PHP7に搭載されました。
・スカラ型のタイプヒンティング
・返り値のタイプヒンティング
・高速な動作
・配列で使うメモリが少ない
・AST(抽象構文木)を使ったコンパイル
19
PHPは今、大きな転換期。
だからこそ、Hack/HHVMの良さを
ぜひ知ってもらいたいと思います。
20
ポイント①
強力なタイプヒンティング
21
タイプヒンティングとは?
functionの引数/戻り値がどの種別かを指定できます。
Class Sample {
public static function sampleFunc(int $a): string{
return "OK";
}
}
//OK
Sample::sampleFunc (1);
//Fatal Error
Sample::sampleFunc ("a");
22
PHPのタイプヒンティング
指定できる種別は、バージョンアップ毎に追加されました。
PHP5.0 :クラス
PHP5.1 :配列
PHP5.4 :クロージャや関数名
PHP7 :スカラー型(int, float, string, bool)
23
タイプヒンティングの仕様は、
HackとPHP7で大きく異なります。
24
タイプヒンティング/PHP7
2つのタイプが存在。
・弱い型指定→自動的な型キャスト。
・強い型指定→型まで厳密に判別。
<?php
Class Sample {
public static function sampleFunc(int $a): string{
return "OK";
}
}
//どちらのタイプでもOK
Sample::sampleFunc(1);
//「弱い型指定」のみOK
Sample::sampleFunc("1");
25
タイプヒンティング/PHP7
・デフォルトは「弱い型指定」
・「強い型指定」には、ファイルの最初で宣言が必要。
・ファイル単位でのみ「強い型指定」が設定可能。
→iniファイル等での指定は不可能。
<?php
//ファイルに「強い型指定」が有効になる。
declare(strict_types=1);
26
タイプヒンティング/PHP7
・Nullや複数型の許可を明示することができない。
・タイプヒンティングのあるfunctionにNullを渡すとエラー
<?php
Class Sample {
public static function sampleFunc(int $a): string{
return "OK";
}
}
//Fatal Error
Sample::sampleFunc(null);
27
タイプヒンティング/Hack
・PHP7の「強い型指定」のみが存在。
・mixedを使うことで、Nullを含むあらゆる型を許容できる。
<?hh
Class Sample {
public static function sampleFunc(mixed $a): string{
return "OK";
}
}
//OK
Sample::sampleFunc(null);
Sample::sampleFunc(1);
Sample::sampleFunc(”a");
28
タイプヒンティング/Hack
・Nullを許容する場合には、型の初めに?を付ける。
<?hh
Class Sample {
public static function sampleFunc(?int $a): string{
return "OK";
}
}
//OK
Sample::sampleFunc(null);
Sample::sampleFunc(1);
29
タイプヒンティング/Hack
配列にのKey, Valueに型指定できる。
(ただし実行時のチェックは機能せず、静的解析のみ。)
<?hh
Class Sample {
public static function sampleFunc(array<int, string> $a): string{
return "OK";
}
}
//OK
Sample::sampleFunc(array(1 => "a", 2 => "b"));
Sample::sampleFunc(array(1 => 1, 2 => null));
30
タイプヒンティング/Hack
Enumを指定することで、明示的な制約ができる。
<?hh
enum Size: int {
MEDIUM = 1;
LARGE = 2;
}
Class Sample {
public static function sampleFunc(Size $size): string{
return "OK";
}
}
//OK
Sample::sampleFunc(Size::LARGE);
Sample::sampleFunc(2);
Sample::sampleFunc(4); //チェックは型のみで値は見ない。
//Error
Sample::sampleFunc(”a");
31
タイプヒンティング
・「強い型指定」が基本。
・Nullの許容やmixedが設定可能。
型をきちんと意識した、
大規模サービス向けの仕様。
・「弱い型指定」が基本。
・型の設定のみ可能。
型を意識せず実装できる、
開発速度を重視の仕様。
32
ポイント②
専用のコレクション
33
PHP5系の配列とは
・配列と連想配列を同じものとして扱える。
・配列に入れる型は何でもOK。
・キーは整数または文字列。
・何をキーにしても、値は入れた順番に取り出される。
<?php
//実行するとabと表示される。
$arr = array(1 => ”a", 0 => ”b");
foreach($arr as $value ) {
print($value);
}
34
コレクション/Hack
・独自のコレクションが利用可能(Vector/Map/Set/Pair)
→宣言時に型を指定できる(実行時チェックは行わない)
<?hh
$a = new Map<string, string>;
//OK
$a->set("key1", "value1");
//OK
$a->set("key2", 2);
//OK
$a->set(3, array());
35
コレクション/Hack
・Getメソッドを使うことで、issetでキーをチェックしなくても
Noticeを出さずに値の取り出しが可能。
<?hh
$a = new Map<string, string>;
$a->set("key1", "value1");
//$val1に”value1”が入る。
$val1 = $a->get("key1");
//$val2にNULLが入る。Noticeは発生しない。
$val2 = $a->get("key2");
36
Map
キーと値をセットで格納。
B
A
D
EC
37
Vector
順番に値を保持する純粋な配列。
21 4 53
38
Set
値の集合で、中身の重複が認められない。
BA D EC
39
Pair
2つの値をセットにして保持。
40
配列/コレクション
・4つの独自コレクション。
・コレクションに型を指定可能。
型をきちんと意識した、
大規模サービス向けの仕様。
・”何でも入る”配列のみ利用可能。
・配列の種類、型は意識しない。
連想配列に何でも突っ込める、
開発速度を重視の仕様。
※Null合体演算子はHHVM3.11からHackで利用可能
41
ポイント③
独自の言語仕様
42
独自の言語仕様
・Lambdas (ラムダ式)
・Generics (ジェネリクス)
・Enum (列挙型)
・Tuples (複数の要素を持つ配列)
・Shapes (複数の要素を持つマップ)
43
Enum(値の列挙)
<?hh
enum Size: int {
SMALL = 0;
MEDIUM = 1;
LARGE = 2;
X_LARGE = 3;
}
型を指定した値を宣言できる
44
Tuples(複数型の配列)
<?hh
list($a, $b) = testFunc();
public function testFunc() : (string, int) {
return tuple(“OK”, 1);
}
functionから複数の値を戻せる
45
独自の言語仕様
Hack/HHVMには多くの言語仕様が追加されています。
サービスの導入において、
・バグのないコードを迅速に書けるようになる
・エンジニアがコーディング体験を楽しめる
これらを実現することができています。
46
ポイント④
並列実行のサポート
47
並列実行
Async/Awaitという独自の関数を利用して、
並列処理を実行することができます。
並列実行できる処理はあらかじめ準備されており、
それらを利用することで高速な処理が行えます。
48
並列実行
49
ポイント⑤
静的解析ツール
50
静的解析ツール
hh_clientにより、コードの静的解析が可能。
構文エラーや型の不整合など実行前に潰すことができる。
厳密な型制約を持つHackで利用することで、
バグの少ないコードを実現することができます。
51
実行前に構文チェックを行えます。
・コンパイルエラー
・引数/戻り値の型チェック
・非推奨の構文
・型の不適切な変換
etc
静的解析ツール/Hack(HHVM)
※設定ファイルのhhvm.hack.lang.auto_typecheckで
自動実行の有無を設定可能。
52
ポイント⑥
PHP7の機能を段階的に使える
53
PHP5/7への両対応
・HHVM3.11からPHP7の機能に対応。
・PHP5とPHP7の両方をサポートしていく方針。
・設定ファイル「hhvm.php7.all = 1」で、後方互換のない
PHP7の設定を有効にできる。
・PHP7の機能を個別に適用可能。
https://docs.hhvm.com/hhvm/configuration/INI-settings#php-7-settings
54
ポイント⑦
豊富な採用実績
55
豊富な採用実績
大規模Webサービスを中心に、多くの採用実績があります。
WikipediaやBaidoは多くのソースコードをHack/HHVMに
コミットしています。
https://github.com/facebook/hhvm/wiki/Users
56
素敵なHack/HHVMですが、
不安な点もたくさんあります
57
リリースサイクル
Hack(HHVM)
・8週ごとにリリース。
・3バージョン毎のLTSを1年間のサポート。
PHP
・リリースサイクル1年
・ライフサイクル3年(バグ2年/セキュリティ1年)
LTSを約1年間サポート。
サポートについて/Hack
59
・hhvmが落ちる→監視して自動で再起動
・peclが利用できない→golangで記述(HNI挑戦中)
・突然のCentOS6サポート停止→CentOS7へ移行
・ほとんどのIDEが対応していない
運用で直面した問題点
60
ググラビリティが非常に低い。
問題点
61
HHVMのPHP7対応状況
62
HHVMはPHP7に対応していく方針
http://hhvm.com/blog/10859/php-7-support
63
ざっくりポイント
・PHP7リリースはHHVMにとっても本当にめでたい。
・HHVM3.11からPHP7の機能に対応していく。
・PHP5とPHP7の両方をサポートしていく方針。
・設定ファイル「hhvm.php7.all = 1」で、後方互換のない
PHP7の設定を有効にできる。
https://docs.hhvm.com/hhvm/configuration/INI-settings#php-7-settings
64
PHP7に関するissueをGithubで確認可能
https://github.com/facebook/hhvm/labels/php7%20incompatibility
65
まとめ
・PHP7とHackは似たようで異なる機能がある。
・Hackには「大規模開発」によりフォーカス。
・HackはPHPと分裂せず、同期して進化する。
66
コミュニティの投票によって機能実装が決まるPHPと
Facebookによって開発されるHack言語。
PHPは「緩いPHPらしさ」を大切にしており、Hack言
語は「実用性としての正しさ」を大切にしているよう
に感じています。
個人的な印象
67
PHPという優れた言語の未来に
選択肢があることは素晴らしい!
68
PHP7が出ましたが、まだまだ
Hack/HHVMを選ぶ価値はあります!
69
ご静聴ありがとうございました。
70
この資料は、正確な記述を心がけて作成していますが、
内容の正確性や有用性を作者は保証しません。また、本
資料は作者個人が作成したものであり、所属する組織・
団体の見解等を表すものではありません。
免責事項

PHP7ではなくHack/HHVMを選ぶ理由