狠狠撸

狠狠撸Share a Scribd company logo
Introducing HHVM/Hack Async
2017/10/8@KenjiroKubota
Pro le
Kenjiro Kubota
istyle.inc
こういうことがありました。
多くのAPIをProxyするAPIを作る
Go
でも私は笔贬笔别谤だから。
Guzzle Promise
どうせなら言語的に並列がサポートされてる
Hackやってみたい
HHVM/Hack
もちろんPHPerならHHVMは知ってるよね
HipHop Virtual Machine
Facebook製
C++で出来てる
PHPが実行できる
JITコンパイラ
Hack言語が実行できる
Facebook,Wikipedia,Slack...etc
Hackで書くとき
<?hh
書きはじめが <?php ではなく <?hh で書き始める。
拡張子は.hh
.phpを上記の様に書き換えるだけでHackとして実行できる
ちょっとした疑問
Composer使えるの
Yes, PHPライブラリも使えます
namespace使えるの
hhvm/hhvm-autoload
PHP製Frameworkはつかえるの
Zend-Expressive使いましたが特に問題ありません。
たぶん他 Fwもいける
笔贬笔7でよくない
今日その话するから黙っててください。
HHVM/Hackの強み
JITコンパイルされるから速い
PHP7と比べると圧倒的有利とは言えなそう
型チェックが良い
PHP7でも多くサポートされたけど、hh_clientで型チェックされる
独自のコレクション型がある
協調的マルチタスキングを言語的にサポート(Async/Await)
他にもHack独自の実装がありますがあとはぐぐってくださいね
Async
Introducing hhvm hack-async
HHAsiocurl_exec();
を使うことでhttpレスポンスを待っている間に次の処理を開始する仕組
み
HHAsiojoin(<Awaitable>);
で、並列処理したものを受け取る
<?hh
namespace HackUserDocumentationAsyncIntroExamplesCurl;
async function curl_A(): Awaitable<string> {
$x = await HHAsiocurl_exec("http://example.com/");
return $x;
}
async function curl_B(): Awaitable<string> {
$y = await HHAsiocurl_exec("http://example.net/");
return $y;
}
async function async_curl(): Awaitable<void> {
$start = microtime(true);
list($a, $b) = await HHAsiov(array(curl_A(), curl_B()));
$end = microtime(true);
echo "Total time taken: " . strval($end - $start) . " seconds" . PHP_EOL;
}
HHAsiojoin(async_curl());
Guzzle Promiseじゃだめなの
比較
レスポンスに1秒かかるエンドポイントに対して並列に実行
並列数 HHVM(3.21.1)/Hack PHP7.1
100 1.2360050678253 秒 1.38831615448 秒
1000 2.1049609184265 秒 3.3101191520691 秒
https://github.com/kubotak-is/async-test
Hack Winner!
実際に使ってみて
並列処理ならGoがいいって思うな。
だけど、PHPerなら今日からHackで簡単に並列を実装できるよ!
笔贬笔别谤のみんな~贬补肠办やろうよ~
thanks:)

More Related Content

Introducing hhvm hack-async