狠狠撸
Submit Search
贬贬痴惭/贬补肠办を本番投入した话
?
0 likes
?
310 views
K
Kenjiro Kubota
Follow
HHVM/Hack勉強会 vol.1 20分枠
Read less
Read more
1 of 31
Download now
Download to read offline
More Related Content
贬贬痴惭/贬补肠办を本番投入した话
1.
HHVM/Hack を本番投入した話 2018/4/20@KenjiroKubota
2.
Pro le Kenjiro Kubota istyle.inc favorite:
PHP Javascript ...Hack!
3.
この中で贬补肠办を书いている触书いたことがある人
4.
この中で贬贬痴惭环境を本番で使ってる人
5.
アイスタイルでHHVM/Hackを採用した経緯 いくつかの社内サービスAPIをまとめるProxyのようなサーバーサイ ドアプリケーションが必要だった。
6.
アイスタイルでHHVM/Hackを採用した経緯 いくつかの社内サービスAPIをまとめるProxyのようなサーバーサイ ドアプリケーションが必要だった。 Golangは社内事例が既にいくつもあった。
7.
アイスタイルでHHVM/Hackを採用した経緯 いくつかの社内サービスAPIをまとめるProxyのようなサーバーサイ ドアプリケーションが必要だった。 Golangは社内事例が既にいくつもあった。 開発担当者(私)がPHPer。PHP愛にあふれていた
8.
アイスタイルでHHVM/Hackを採用した経緯 いくつかの社内サービスAPIをまとめるProxyのようなサーバーサイ ドアプリケーションが必要だった。 Golangは社内事例が既にいくつもあった。 開発担当者(私)がPHPer。PHP愛にあふれていた でもPHPで並列でAPIをコールするのがつらそう
9.
あ、贬补肠办なら并列で础笔滨コールできるはず
10.
アイスタイルでHHVM/Hackを採用した経緯 いくつかの社内サービスAPIをまとめるProxyのようなサーバーサイ ドアプリケーションが必要だった。 Golangは社内事例が既にいくつもあった。 開発担当者(私)がPHPer。PHP愛にあふれていた でもPHPで並列でAPIをコールするのがつらそう 部長が二つ返事でOKだったので採用 あとは部長が社内的にパワープレイで???
11.
フレームワーク選定 とくにこだわりもなく、HHVM上で動くものならなんでもよかっ た。 とはいえあまり大げさなFWは不要 Lumen, Silex, Slim3,
ZendExpressive SymfonyはHHVMのサポートやめたって聞いたのでLumen除外 ZendExpressiveは何回か書いたことあるのですぐに作れそう ZendExpressiveを採用
12.
最新版のZendExpressiveがHHVM上で動かない 開発当初のv2系がHHVM上で動作しませんでした。 v1系に落としたところ問題なく動作したので開発続行
13.
IDE HackはPHPer愛用のPHPStormでは一切補完が効かない Facebook社製AtomPluginのNuclideかVisualStudioCodeの HackPluginがオススメ -(というかそれしか選択肢が無い) 後者の場合はローカルにHHVMをインストールしないとコードジャ ンプできません。(たぶん) Windowsで開発するのがだいぶ辛いです。
14.
Dir構成 ├─config │ └─autoload ├─data │ └─cache ├─public │
└─apidoc ├─src │ ├─Action │ ├─Client │ ├─Entity │ ├─Exception │ ├─Foundation │ ├─Middleware │ ├─Repository │ ├─Service │ ├─UseCase │ └─ValueObject ├─storage │ └─logs └─test
15.
処理の流れとしては Middleware -> Action
-> Service or UseCase -> Repository -> Client ActionClass層以下はほぼほぼAsync関数で実装していて、各APIコール のレスポンス時間を無駄にしない。
16.
Action Class
17.
<?hh final class ExampleAction { public
function __construct( private ExampleService $exampleService ) {} public function __invoke( ServerRequestInterface $request, ResponseInterface $response, ?callable $next = null ): JsonResponse { $query = (array) $request->getQueryParams(); $example = HHAsiojoin($this->exampleService->get((string)$query['hoge'])); $res = [ 'count'=> $example->count(), 'hoge' => $example->toArray() ]; return new JsonResponse($res); } }
18.
public function __construct( private
ExampleService $exampleService ) {} はPHPの以下に相当 private $exampleService; public function __construct(ExampleService $exampleService) { $this->exampleService = $exampleService; }
19.
Async function $example =
HHAsiojoin($this->exampleService->get((string)$query['hoge'])); $this->exampleService->get() この関数はasync関数となっていて、Awaitable型が返却される。 async function get(string $hoge): Awaitable<Map> その際には HHAsiojoin() で受け取ることで非同期から同期的な処理に することができる。 感覚としてはjavascriptのPromiseっぽい?
20.
Collection $example = HHAsiojoin($this->exampleService->get((string)$query['hoge'])); $res
= [ 'count'=> $example->count(), 'hoge' => $example->toArray() ]; Hackが独自で持っている配列の拡張 Vector , ImmVector , Map , ImmMap , Set , ImmSet , Pair 上の例では $example は Map 型になるので ->count() や ->toArray() 関数を持 っている。(便利)
21.
落とし穴その壱 foreachによるイテレートはブロッキングする
22.
foreachの中でawaitで受け取るパターン $lists の一つ一つの値を使って並列にAPIをコールしたとする。 foreach($lists as
$list) { $array[] = await $this->getDetail($list); } 一見非同期的に getDetail() が実行されるかと思いきや、1回ループが 回るたびにawaitを待つような挙動になるのでPHPと変わらず遅い そういう場合は以下のようにするとブロッキングしない async function getLists(Vector $lists): Awaitable<Map> { $handle = $lists->map($list ==> $this->getDetail($list)); return await HHAsiom($handle); }
23.
(追記) 多分以下でも大丈夫 (Lamdaの書き方がかっこよかったので使ってみたかったマン) foreach($lists as $list)
{ $array[] = $this->getDetail($list); } return await HHAsiom($array);
24.
落とし穴その弐 HHAsiocurl_execでHHVMがクラッシュ
26.
どうなっていたのか(再掲) HHAsiocurl_exec が内部で利用している curl_multi_await
という HHVM(C++)関数でレスポンスが遅いエンドポイントがある場合に Abortするバグがあった。 PHPのリクエスト、レスポンスの処理とは違い、HHVMではレスポン スを返した後もこの関数が実行され続けてしばらくすると落ちる挙動に なっていた このため、どのタイミングでHHVMがクラッシュするのかの把握が遅 れた???
27.
1/5に修正される(再掲) c++で実装していた curl_multi_await をhack実装に変更 async
function curl_multi_await( resource $mh, float $timeout = 1.0, ): Awaitable<int> { $finish_by = microtime(true) + $timeout; do { $result = curl_multi_select($mh, 0.0); if ($result !== 0) { return $result; } await HHAsiolater(); } while (microtime(true) < $finish_by); return 0; }
28.
現在の最新ver3.25.2には修正反映済み PHPerkaigi2018時点では反映されてませんでした。
29.
Hackの良かったところ Collection型が地味に便利 enumがある!(PHPには言語的にはない) Pipe Operatorがいい! f() |>
g($$) |> h(5, $$) === h(5, g(f())) 無名関数をしゅっとかけるLamdaが良い <?hh $user = 'Joel'; $greeting = () ==> 'Hello '.$user; // Hello Joel
30.
Hackを導入してみて... PHPに似ているのはPHPerにとっては学習コストがほぼゼロ (ゼロとは言ってない) PHPでもう少しこう書けたらいいな、みたいなことができて良い PHP + JavascriptみたいなノリでAPIの並列コールができてしまっ た。 バグを踏み抜くと辛い どんどん新しい要素が盛り込まれていくので楽しみではある
31.
thanks:)
Download