Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

10,522 views

Published on

2月24日に開催された第99回PHP勉強会での発表資料です。
Hack/HHVMの特徴について説明しています。

Published in: Technology

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

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

×