Submit Search
Upload
HHVM/Hackを本番投入した話
•
0 likes
•
310 views
K
Kenjiro Kubota
Follow
HHVM/Hack勉強会 vol.1 20分枠
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 31
Download now
Download to read offline
Recommended
いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-
Masashi Shinbara
認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション
Masashi Shinbara
もう XAMPP / MAMP はいらない! Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない! Vagrant で作る PHP 開発環境
Masashi Shinbara
Vagrant で作る PHP 開発環境 [実践編]
Vagrant で作る PHP 開発環境 [実践編]
Masashi Shinbara
WordPress on HHVM + Hack
WordPress on HHVM + Hack
Takayuki Miyauchi
Symfony Dump Server のご紹介
Symfony Dump Server のご紹介
知之 朝枝
flyingV Laravel & AWS 經驗分享
flyingV Laravel & AWS 經驗分享
Eugene Wang
Vagrant で PHP 開発環境を作る ハンズオン
Vagrant で PHP 開発環境を作る ハンズオン
Masashi Shinbara
Recommended
いまどきのPHP開発現場 -2015年秋-
いまどきのPHP開発現場 -2015年秋-
Masashi Shinbara
認証機能で学ぶ Laravel 5 アプリケーション
認証機能で学ぶ Laravel 5 アプリケーション
Masashi Shinbara
もう XAMPP / MAMP はいらない! Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない! Vagrant で作る PHP 開発環境
Masashi Shinbara
Vagrant で作る PHP 開発環境 [実践編]
Vagrant で作る PHP 開発環境 [実践編]
Masashi Shinbara
WordPress on HHVM + Hack
WordPress on HHVM + Hack
Takayuki Miyauchi
Symfony Dump Server のご紹介
Symfony Dump Server のご紹介
知之 朝枝
flyingV Laravel & AWS 經驗分享
flyingV Laravel & AWS 經驗分享
Eugene Wang
Vagrant で PHP 開発環境を作る ハンズオン
Vagrant で PHP 開発環境を作る ハンズオン
Masashi Shinbara
LaravelでAPI定義を管理する
LaravelでAPI定義を管理する
Kenjiro Kubota
FuelPHPでSentry導入
FuelPHPでSentry導入
fagai
Ansible ではじめるサーバ作業の自動化
Ansible ではじめるサーバ作業の自動化
Masashi Shinbara
ビルドサーバで使うDocker
ビルドサーバで使うDocker
Masashi Shinbara
Vagrant を Web開発環境に使う
Vagrant を Web開発環境に使う
Masashi Shinbara
Vagrant入門以前
Vagrant入門以前
katanyan
PHP5.6からPHP7.0への移行
PHP5.6からPHP7.0への移行
Yasuo Ohgaki
開発現場で活用するVagrant
開発現場で活用するVagrant
Masashi Shinbara
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
Kenjiro Kubota
Responsableを使ったadr実装
Responsableを使ったadr実装
Kenjiro Kubota
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
Yuta Matsumura
VagrantからDockerに開発環境を移行した時の話
VagrantからDockerに開発環境を移行した時の話
Daijiro Abe
Vagrant - 最近流行ってるらしいけど何者?
Vagrant - 最近流行ってるらしいけど何者?
Yoshinori Nakanishi
Twilio API を PHP で触ってみよう
Twilio API を PHP で触ってみよう
Masashi Shinbara
Word bench7月号
Word bench7月号
西村 州平
20191003 classi night-04
20191003 classi night-04
Akihiko Kigure
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
Kenjiro Kubota
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
Shogo Kawahara
RespClient - Minimal Redis Client for PowerShell
RespClient - Minimal Redis Client for PowerShell
Yoshifumi Kawai
React Native GUIDE
React Native GUIDE
dcubeio
20190608LT資料
20190608LT資料
ssuseraa32c9
Heroku で作る スケーラブルな PHP アプリケーション
Heroku で作る スケーラブルな PHP アプリケーション
Masashi Shinbara
More Related Content
What's hot
LaravelでAPI定義を管理する
LaravelでAPI定義を管理する
Kenjiro Kubota
FuelPHPでSentry導入
FuelPHPでSentry導入
fagai
Ansible ではじめるサーバ作業の自動化
Ansible ではじめるサーバ作業の自動化
Masashi Shinbara
ビルドサーバで使うDocker
ビルドサーバで使うDocker
Masashi Shinbara
Vagrant を Web開発環境に使う
Vagrant を Web開発環境に使う
Masashi Shinbara
Vagrant入門以前
Vagrant入門以前
katanyan
PHP5.6からPHP7.0への移行
PHP5.6からPHP7.0への移行
Yasuo Ohgaki
開発現場で活用するVagrant
開発現場で活用するVagrant
Masashi Shinbara
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
Kenjiro Kubota
Responsableを使ったadr実装
Responsableを使ったadr実装
Kenjiro Kubota
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
Yuta Matsumura
VagrantからDockerに開発環境を移行した時の話
VagrantからDockerに開発環境を移行した時の話
Daijiro Abe
Vagrant - 最近流行ってるらしいけど何者?
Vagrant - 最近流行ってるらしいけど何者?
Yoshinori Nakanishi
Twilio API を PHP で触ってみよう
Twilio API を PHP で触ってみよう
Masashi Shinbara
Word bench7月号
Word bench7月号
西村 州平
20191003 classi night-04
20191003 classi night-04
Akihiko Kigure
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
Kenjiro Kubota
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
Shogo Kawahara
RespClient - Minimal Redis Client for PowerShell
RespClient - Minimal Redis Client for PowerShell
Yoshifumi Kawai
React Native GUIDE
React Native GUIDE
dcubeio
What's hot
(20)
LaravelでAPI定義を管理する
LaravelでAPI定義を管理する
FuelPHPでSentry導入
FuelPHPでSentry導入
Ansible ではじめるサーバ作業の自動化
Ansible ではじめるサーバ作業の自動化
ビルドサーバで使うDocker
ビルドサーバで使うDocker
Vagrant を Web開発環境に使う
Vagrant を Web開発環境に使う
Vagrant入門以前
Vagrant入門以前
PHP5.6からPHP7.0への移行
PHP5.6からPHP7.0への移行
開発現場で活用するVagrant
開発現場で活用するVagrant
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
Responsableを使ったadr実装
Responsableを使ったadr実装
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
イケてる技術で品質を担保しつつスピード感のある開発を実現する冴えたやり方
VagrantからDockerに開発環境を移行した時の話
VagrantからDockerに開発環境を移行した時の話
Vagrant - 最近流行ってるらしいけど何者?
Vagrant - 最近流行ってるらしいけど何者?
Twilio API を PHP で触ってみよう
Twilio API を PHP で触ってみよう
Word bench7月号
Word bench7月号
20191003 classi night-04
20191003 classi night-04
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
RespClient - Minimal Redis Client for PowerShell
RespClient - Minimal Redis Client for PowerShell
React Native GUIDE
React Native GUIDE
Similar to HHVM/Hackを本番投入した話
20190608LT資料
20190608LT資料
ssuseraa32c9
Heroku で作る スケーラブルな PHP アプリケーション
Heroku で作る スケーラブルな PHP アプリケーション
Masashi Shinbara
php-timecopを実戦投入してみた
php-timecopを実戦投入してみた
Yoshio Hanawa
FuelPHP活用事例
FuelPHP活用事例
Yusuke Naka
PHPべんちまーく
PHPべんちまーく
chichi1091
HHVM Hack
HHVM Hack
Masaaki Yonebayashi
Phpcon2020sponsor lt php8_on_lambda
Phpcon2020sponsor lt php8_on_lambda
Hideo Kashioka
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
Yuki Kanazawa
Facebook対応と大規模サイト移転のトライ&エラー
Facebook対応と大規模サイト移転のトライ&エラー
Garyuten
PSGIへの誘い
PSGIへの誘い
azuma satoshi
Server pushnavigations
Server pushnavigations
ivoryworks .
appengine ja night #25 Google App Engine for PHP
appengine ja night #25 Google App Engine for PHP
Ryo Yamasaki
Xhprof
Xhprof
Hisashi Aruji
Terraform with Bitbucket pipeline
Terraform with Bitbucket pipeline
Masatomo Ito
Datadog monitoring with HashiCorp
Datadog monitoring with HashiCorp
Masatomo Ito
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
Ryuji Yamashita
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo!デベロッパーネットワーク
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
Hironobu Saitoh
Automation of Rolling Upgrade of Hadoop Cluster without Data Lost and Job Fai...
Automation of Rolling Upgrade of Hadoop Cluster without Data Lost and Job Fai...
Yahoo!デベロッパーネットワーク
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Yahoo!デベロッパーネットワーク
Similar to HHVM/Hackを本番投入した話
(20)
20190608LT資料
20190608LT資料
Heroku で作る スケーラブルな PHP アプリケーション
Heroku で作る スケーラブルな PHP アプリケーション
php-timecopを実戦投入してみた
php-timecopを実戦投入してみた
FuelPHP活用事例
FuelPHP活用事例
PHPべんちまーく
PHPべんちまーく
HHVM Hack
HHVM Hack
Phpcon2020sponsor lt php8_on_lambda
Phpcon2020sponsor lt php8_on_lambda
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
【PHPカンファレンス福岡】PHP 5.3 + CakePHP 1.3 → PHP 7 + CakePHP 3 移行を決めた話
Facebook対応と大規模サイト移転のトライ&エラー
Facebook対応と大規模サイト移転のトライ&エラー
PSGIへの誘い
PSGIへの誘い
Server pushnavigations
Server pushnavigations
appengine ja night #25 Google App Engine for PHP
appengine ja night #25 Google App Engine for PHP
Xhprof
Xhprof
Terraform with Bitbucket pipeline
Terraform with Bitbucket pipeline
Datadog monitoring with HashiCorp
Datadog monitoring with HashiCorp
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
PHP in Java -Quercus- によるレガシーマイグレーション実例 #jjug_ccc #ccc_r12
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
PHPで並列処理する ライブラリを作った
PHPで並列処理する ライブラリを作った
Automation of Rolling Upgrade of Hadoop Cluster without Data Lost and Job Fai...
Automation of Rolling Upgrade of Hadoop Cluster without Data Lost and Job Fai...
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
More from Kenjiro Kubota
いまどき(これから)のPHP開発
いまどき(これから)のPHP開発
Kenjiro Kubota
アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演)
Kenjiro Kubota
gRPC入門
gRPC入門
Kenjiro Kubota
アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例
Kenjiro Kubota
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
Kenjiro Kubota
フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界
Kenjiro Kubota
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
Kenjiro Kubota
カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話
Kenjiro Kubota
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見た
Kenjiro Kubota
introducing vue-wait-component
introducing vue-wait-component
Kenjiro Kubota
HackのAsyncCurlで死んだ話
HackのAsyncCurlで死んだ話
Kenjiro Kubota
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey
Kenjiro Kubota
Introducing hhvm hack-async
Introducing hhvm hack-async
Kenjiro Kubota
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!
Kenjiro Kubota
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦う
Kenjiro Kubota
Laravel aspectで関心の分離
Laravel aspectで関心の分離
Kenjiro Kubota
More from Kenjiro Kubota
(16)
いまどき(これから)のPHP開発
いまどき(これから)のPHP開発
アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演)
gRPC入門
gRPC入門
アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見た
introducing vue-wait-component
introducing vue-wait-component
HackのAsyncCurlで死んだ話
HackのAsyncCurlで死んだ話
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey
Introducing hhvm hack-async
Introducing hhvm hack-async
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦う
Laravel aspectで関心の分離
Laravel aspectで関心の分離
HHVM/Hackを本番投入した話
1.
HHVM/Hack を本番投入した話 2018/4/20@KenjiroKubota
2.
Pro le Kenjiro Kubota istyle.inc favorite:
PHP Javascript ...Hack!
3.
この中でHackを書いている|書いたことがある人
4.
この中でHHVM環境を本番で使ってる人
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.
あ、Hackなら並列でAPIコールできるはず
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がクラッシュ
25.
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 now