HHVM Hack
Upcoming SlideShare
Loading in...5
×
 

HHVM Hack

on

  • 1,539 views

HHVM Hack

HHVM Hack
BPStudy#81
original file : http://yone098.github.io/hhvm-hack/#/

Statistics

Views

Total Views
1,539
Views on SlideShare
928
Embed Views
611

Actions

Likes
5
Downloads
10
Comments
0

5 Embeds 611

http://dev.classmethod.jp 447
http://bpstudy.connpass.com 82
https://twitter.com 73
http://www.slideee.com 8
http://news.google.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

HHVM Hack HHVM Hack Presentation Transcript

  • HHVM Hack BPStudy#81 2014/05/30
  • About Me 米林 正明@yone098 株式会社Abby CEO  
  • About Me 米林 正明@yone098 株式会社Abby CEO 社員募集中! View slide
  • Agenda     Hack HHVM Hack Features Tool Web Application Performance HHVM Extension PHP2HHVM View slide
  • Hack
  • Hack HackとはFacebookがリリースしたPHPと互換性を持つ HHVM(Hip Hop Virtual Machine for PHP) 向けの開発言語 Facebookのサイトは2013年以降PHPからHackへ移行 Facebookでの実績 特長 Nullable, Generics, etc... http://hacklang.org/      
  • Hack HackとはFacebookがリリースしたPHPと互換性を持つ HHVM(Hip Hop Virtual Machine for PHP) 向けの開発言語 Facebookのサイトは2013年以降PHPからHackへ移行 Facebookでの実績 特長 Nullable, Generics, etc... http://hacklang.org/ Summary PHPの代替になる新しいプログラミング言語
  • HHVM
  • HHVM HHVM(HipHop Virtual Machine)とはFacebookが開発・公開し ているC++で実装されたJITコンパイラPHP実行環境 JITコンパイル-> 高速動作 Hackを動作させる唯一のVM FastCGIインターフェース仕様でnginx, Apacheと動作 最新version (2014/05/30現在) http://hhvm.org/ $ hhvm --version HipHop VM 3.2.0-dev (rel)  
  • HHVM HHVM(HipHop Virtual Machine)とはFacebookが開発・公開し ているC++で実装されたJITコンパイラPHP実行環境 JITコンパイル-> 高速動作 Hackを動作させる唯一のVM FastCGIインターフェース仕様でnginx, Apacheと動作 最新version (2014/05/30現在) http://hhvm.org/ $ hhvm --version HipHop VM 3.2.0-dev (rel) Summary PHPとHackを動作させるVM
  • Hack Features
  • Hack Features 概要説明 Type Annotations Nullable Generics Collection Type Aliasing Variable Number of Arguments
  • Hack Features Type Annotations 静的型付けがあり関数の引数や戻り値に明示的に型を宣 言することが可能 class AnnotatedClass { public int $i = 10; private string $str = "STRING"; protected array $arr = array(1, 2); } function return_int_func(bool $flg): int { return 100; }
  • Hack Features Nullable null を許容するかどうかを?で指定可能 function nullable_arg_func(?string $name) : string { if ($name === null) return "name is null"; return "Hello " . $name; } function null_ng_arg_func(string $name) : string { return "Hello " . $name; } nullable_arg_func(null); null_ng_arg_func(null); // エラー発生 実行結果 $ hhvm examples.php Fatal error: Argument 1 passed to null_ng_arg_func() must be an instance of string, null given in /home/yone098/examples.php on line 10
  • Hack Features Generics C++, Java, C# のようなGenrics が利用可能 class Dog<T> { private ?T $name; public function __construct(T $name) { $this->name = $name; } public function get_name() : T { return $this->name; } } $dog = new Dog("garsue"); echo("dog->get_name()=" . $dog->get_name() . "n"); $map = Map<string, int> { "a" => 1, "b" => 2 }; var_dump($map); 実行結果 dog->get_name=garsue object(HHMap)#2 (2) { ["a"]=> int(1) ["b"]=>int(2)}
  • Hack Features Collections HackではVector,Map,Set,PairというCollectionsが利用 可能 $vector = Vector<int> { 100, 200, 300, 400 }; $vector[] = 700; // 追加 $vector[0] = 111; // 上書き $vector->removeKey(2); foreach ($vector as $v) { echo $v . "n"; } $map = Map<string, long> {"a" => 100, "b" => 200, "c" => 300}; $map["d"] = 400; echo "map->get("b") = ". $map->get("b") . "n"; var_dump($map->contains("a")); // map filterWithKey $map_filter = $map->filterWithKey(function($k, $v) { return ($k === "b" || $k === "c"); }); var_dump($map_filter);
  • Hack Features Type Aliasing Hackでは,typeおよびnewtypeの宣言で既存の型に別名を つけることが可能。 type user_id = int; // 引数の型は user_id function get_user_name(user_id $user_id): string { return "mopemope"; } newtype password = string; // 引数の型は password function login(user_id $user_id, password $password): bool { return true; }
  • Hack Features Variable Number of Arguments Hack では可変長引数を... と明示的に指定可能 function test_many_args(int $num, ...): void { echo "num:" . $num . "n"; foreach (func_get_args() as $e) { var_dump($e); } } test_many_args(100, "garsue", 1, array(), 3.14); 実行結果 num:100 int(100) string(6) "garsue" int(1) array(0) { } object(Yone)#8 (0) { } float(3.14)
  • Tool
  • Tool Debugger デバッガー機能(step実行等) hh_client 実行前に静的型付けのチェック fastcgi 設定・設定解除
  • Tool Debugger 起動:hhvm -m debug ファイル名 ブレークポイント:break 関数名 ステップ実行:step 確認:print 変数名 現在: * Break at loop() on line 3 of /home/yone098/debug.php 2 function loop() : void { 3* for ($i = 1; $i <= 3; $i++) { 4 $sum += $i; hphpd> print $sum 1 demo
  • Tool Debugger variable (Web application) hphpd> variable $argv = Array() $_FILES = Array() $_SERVER = Array([XDG_SESSION_ID] => "4", [USER] => "yone098", [SSH_TTY] => ... $_GET = Array() $_COOKIE = Array() $argc = 0 $_REQUEST = Array() $_POST = Array()
  • Tool hh_client 実行前に静的型付けチェック 指定フォルダに.hhconfig という空のファイルを置く hh_client コマンドを実行 .hhconfig が無い場合 $ hh_client Error: not a www tree (or any of the parent directories): /sample
  • Tool hh_client 不正な箇所がある場合に行番号と内容を表示 bad.php <?hh function bad_func() : int { return "Hello, BpStudy#81"; } bad_func();   実行結果 $ hh_client /home/yone098/bad.php:3:10,28: Invalid return type /home/yone098/bad.php:2:23,25: This is an int /home/yone098/bad.php:3:10,28: It is incompatible with a string プロジェクトのルートフォルダに.hhconfig ファイルを設置 しチェックを行うのがベスト
  • Tool fastcgi apache, nginx に対してfastcgi 設定を自動で行う /usr/share/hhvm/install_fastcgi.sh /usr/share/hhvm/uninstall_factcgi.sh apache, nginx をインストールしたあとにシェルを実行する ことですんなりHHVM が稼働します 当初は自前で設定する必要があったため即動かす事が容易 ではなかった
  • WebApplication
  • WebApplication first step はまりどころ
  • WebApplication First step phpinfo を確認する HHVM が正常に稼働していれば画面にはHipHop とだけ 表示されます 503エラーなどが出る場合は、fastcgi の設定が間違って いるかHHVM が起動していない可能性があります check.php <?hh phpinfo(); 実行結果 HipHop
  • WebApplication はまりどころ configrations HHVM 2 系の際は/etc/hhvm/php.ini および /etc/hhvm/server.ini の設定が有効(厳密には以前は server.hdf) HHVM 3 系の場合はphp include_path の設定が効かない ため実行時に設定する必要がある <?hh echo 'include_path[' . get_include_path() . '][' . ini_get('include_path') . "]<br/>n"; ini_set('include_path', '/usr/lib/Smarty-3.1.18/libs' . PATH_SEPARATOR . ini_get('include_path')); require_once('Smarty.class.php');
  • WebApplication はまりどころ 実行時 <?hh echo でHTMLに記載したものはまだ動かない <html> <body> <?php echo $user_name; ?> <hr/> <?hh echo $user_name; ?> <!-- これは動作しない --> </body> </html>
  • Performance
  • Performance bench.php <?php function loop_test() { $sum = 0; for ($i = 0; $i < 1000000; $i++) { $sum += $i * 2; } } function main() { $startTime = microtime(true); loop_test(); $endTime = microtime(true); echo $endTime - $startTime . "[sec]n"; // 再度実行 } main();
  • Performance result php : hhvm = 1 : 10 yone098@ubuntu-docker:~/work$ hhvm bench.php 0.012295007705688[sec] 0.010360956192017[sec] yone098@ubuntu-docker:~/work$ hhvm bench.php 0.0089778900146484[sec] 0.011922836303711[sec] yone098@ubuntu-docker:~/work$ php bench.php 0.10031509399414[sec] 0.098863124847412[sec] yone098@ubuntu-docker:~/work$ php bench.php 0.09879994392395[sec] 0.099910974502563[sec]
  • Performance wordpress ab wordpress nginx + php-fpm Requests per second: 19.53 [#/sec] (mean) Time per request: 2560.771 [ms] (mean) Time per request: 51.215 [ms] (mean, across all concurrent requests) Transfer rate: 154.85 [Kbytes/sec] received wordpress nginx + fastcgi + hhvm Requests per second: 42.97 [#/sec] (mean) Time per request: 1163.692 [ms] (mean) Time per request: 23.274 [ms] (mean, across all concurrent requests) Transfer rate: 340.33 [Kbytes/sec] received
  • HHVM Extensions
  • HHVM Extensions HHVMの拡張機能でありC++ の既存資産を生かす事が可能 HNI (HHVM Native Interface) と呼ばれるHackの記法を使う 必要ファイル config.cmake ext_hnifib.php (HNIで登録) hnifib.cpp (HHVM_XX で登録) build (hphpizeコマンド) exec (-vDinamicExtensions.0=ライブラリ.so) 本家のはそのままじゃ動かない https://github.com/facebook/hhvm/wiki/Extension-API https://github.com/yone098/hhvm-extensions-examples
  • HHVM Extensions config.cmake 必要に応じて適宜ライブラリを追加 HHVM_EXTENSION(hnifib hnifib.cpp) HHVM_SYSTEMLIB(hnifib ext_hnifib.php)   ext_sample.php <?hh で記述 <<__Native>> Attribute で登録 <?hh <<__Native>> function hni_fib(int $n) : int;
  • HHVM Extensions sample.cpp HNI 用include HHVM_FUNCTION で定義, HHVM_FE で登録 Extension クラスを継承 #include "hphp/runtime/base/base-includes.h" namespace HPHP { static int64_t HHVM_FUNCTION(hni_fib, int64_t n) { if (n <= 2) return 1; return HPHP::f_hni_fib(n - 2) + HPHP::f_hni_fib(n - 1); } static class HnifibExtension : public Extension { public: HnifibExtension() : Extension("hnifib") {} virtual void moduleInit() { HHVM_FE(hni_fib); loadSystemlib(); } } s_hnifib_extension; HHVM_GET_MODULE(sample) }
  • HHVM Extensions build                       hphpize cmake . make   run                       -vDynamicExtensions.0 hhvm -vDynamicExtensions.0=${DIRNAME}/hnifib.so ${DIRNAME}/app.php
  • HHVM Extensions Performance <?php function fib($n) { if ($n <= 2) return 1; return fib($n - 2) + fib($n - 1); } for ($i = 1; $i <= 20; $i++) echo(fib($i) . " "); result HNI 速い! > hhvm > php $ php fib.php 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 0.013734102249146[sec] $ hhvm fib.php 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 0.0083420276641846[sec] $ ./run.sh 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 0.0031008720397949[sec]
  • PHP2HHVM
  • PHP2HHVM PHP ファイルをそのまま使う HHVM のみ利用する(お勧め) PHP ファイルをHack に移行 ソースの先頭は一括置換(<?PHP から<?hh ) 関数の引数・戻り値に型を明示的に指定 null を許容する場合のみ明示的に? を指定 積極的にCollection を利用する(速度よびメモリ使用量削 減) hh_client にてチェックを行う
  • まとめ
  • まとめHack は無理に導入する必要は無い 使いたい人は使おう HHVM 積極的に採用しよう Facebook の実績 3年後HHVM がデファクト・スタンダード nginx の出始めの頃
  • 一句
  • 母の日に Hack 使って 四苦八苦
  • ありがとう ございました