Your SlideShare is downloading. ×
0
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
HHVM Hack
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

HHVM Hack

2,415

Published on

HHVM Hack …

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

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,415
On Slideshare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
22
Comments
0
Likes
7
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. HHVM Hack BPStudy#81 2014/05/30
  • 2. About Me 米林 正明@yone098 株式会社Abby CEO  
  • 3. About Me 米林 正明@yone098 株式会社Abby CEO 社員募集中!
  • 4. Agenda     Hack HHVM Hack Features Tool Web Application Performance HHVM Extension PHP2HHVM
  • 5. Hack
  • 6. Hack HackとはFacebookがリリースしたPHPと互換性を持つ HHVM(Hip Hop Virtual Machine for PHP) 向けの開発言語 Facebookのサイトは2013年以降PHPからHackへ移行 Facebookでの実績 特長 Nullable, Generics, etc... http://hacklang.org/      
  • 7. Hack HackとはFacebookがリリースしたPHPと互換性を持つ HHVM(Hip Hop Virtual Machine for PHP) 向けの開発言語 Facebookのサイトは2013年以降PHPからHackへ移行 Facebookでの実績 特長 Nullable, Generics, etc... http://hacklang.org/ Summary PHPの代替になる新しいプログラミング言語
  • 8. HHVM
  • 9. 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)  
  • 10. 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
  • 11. Hack Features
  • 12. Hack Features 概要説明 Type Annotations Nullable Generics Collection Type Aliasing Variable Number of Arguments
  • 13. 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; }
  • 14. 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
  • 15. 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)}
  • 16. 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);
  • 17. 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; }
  • 18. 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)
  • 19. Tool
  • 20. Tool Debugger デバッガー機能(step実行等) hh_client 実行前に静的型付けのチェック fastcgi 設定・設定解除
  • 21. 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
  • 22. 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()
  • 23. Tool hh_client 実行前に静的型付けチェック 指定フォルダに.hhconfig という空のファイルを置く hh_client コマンドを実行 .hhconfig が無い場合 $ hh_client Error: not a www tree (or any of the parent directories): /sample
  • 24. 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 ファイルを設置 しチェックを行うのがベスト
  • 25. Tool fastcgi apache, nginx に対してfastcgi 設定を自動で行う /usr/share/hhvm/install_fastcgi.sh /usr/share/hhvm/uninstall_factcgi.sh apache, nginx をインストールしたあとにシェルを実行する ことですんなりHHVM が稼働します 当初は自前で設定する必要があったため即動かす事が容易 ではなかった
  • 26. WebApplication
  • 27. WebApplication first step はまりどころ
  • 28. WebApplication First step phpinfo を確認する HHVM が正常に稼働していれば画面にはHipHop とだけ 表示されます 503エラーなどが出る場合は、fastcgi の設定が間違って いるかHHVM が起動していない可能性があります check.php <?hh phpinfo(); 実行結果 HipHop
  • 29. 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');
  • 30. WebApplication はまりどころ 実行時 <?hh echo でHTMLに記載したものはまだ動かない <html> <body> <?php echo $user_name; ?> <hr/> <?hh echo $user_name; ?> <!-- これは動作しない --> </body> </html>
  • 31. Performance
  • 32. 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();
  • 33. 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]
  • 34. 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
  • 35. HHVM Extensions
  • 36. 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
  • 37. 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;
  • 38. 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) }
  • 39. HHVM Extensions build                       hphpize cmake . make   run                       -vDynamicExtensions.0 hhvm -vDynamicExtensions.0=${DIRNAME}/hnifib.so ${DIRNAME}/app.php
  • 40. 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]
  • 41. PHP2HHVM
  • 42. PHP2HHVM PHP ファイルをそのまま使う HHVM のみ利用する(お勧め) PHP ファイルをHack に移行 ソースの先頭は一括置換(<?PHP から<?hh ) 関数の引数・戻り値に型を明示的に指定 null を許容する場合のみ明示的に? を指定 積極的にCollection を利用する(速度よびメモリ使用量削 減) hh_client にてチェックを行う
  • 43. まとめ
  • 44. まとめHack は無理に導入する必要は無い 使いたい人は使おう HHVM 積極的に採用しよう Facebook の実績 3年後HHVM がデファクト・スタンダード nginx の出始めの頃
  • 45. 一句
  • 46. 母の日に Hack 使って 四苦八苦
  • 47. ありがとう ございました

×