Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
PHPでWEBSOCKETを
実装してみてわかったこと
株式会社 鈴木商店 下地功一
自己紹介
• 下地功一
• 株式会社 鈴木商店
• ドラえもんと犬が好き
• 会社では「標準化」を担当
• ”オーシャン”と呼ばれてます
スタッフ募集中!
https://www.suzukishouten.co.jp/sp_top/index.html
https://www.wantedly.com/companies/suzukishouten/projects
WebSocket?
•Socket.IO(node)
•ActionCable(Rails5)
こういうやつやんな?
※こういうレベルから調査を始めました。
本日お伝えしたいこと
WebSocketおもろそうやん。
やってみよう!
となることを共有。
あれ?
とりあえずサンプルを
動かしてみよう
公式demo
https://socket.io/demos/chat/
SOCKET.IO
サーバ側ソース(キモの部分)
基本的にこのレベルに抽象化されている
カンタン!
カンタン!
ActionCableも試してみた
※省略
カンタンに動いてしまったので
結局よくわからん!
どういうしくみ?
ざっと調べてみた
GET wss://socketio-chat.now.sh/socket.io/?EIO=3&(略)
Host: socketio-chat.now.sh
Connection: Upgrade
Pragma: no-cac...
ざっと調べてみた
HTTP/1.1 101 Switching Protocols
Date: Tue, 20 Jun 2017 07:24:48 GMT
Connection: upgrade
Upgrade: websocket
Sec-W...
chrome devtool
なんとなくわかった!
ひょっとしてすぐ使える?
PHPでも試してみよう!
ライブラリもある
http://socketo.me/
サンプルコードの説明ページ
メッセージキューがいる?
どうやらこんな構成らしい
クライアント
Web
サーバプロセス
WebSocket
サーバプロセス
メッセージキュー
※別のポート番号
なんとか
環境を作成!
…面倒やな
Webサーバからの通知を送信する
$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher');
$socket->conne...
もうちょっとしらべてみた
サーバをまたいで
通知
クライアントA
ActionCableA ActionCableB
Redis
Pub/SubPub/Sub
クライアントB
※まともに動かすためにはちゃんとインフラにも気を使わないといけない
接続が切れる
ページのリロード
新しいアプリケーションのデプロイ
etc...
そもそも繋がらない
Http Proxy
WebSocketを知らずに弾いちゃう
ロードバランサ
Upgradeが失敗する場合あり
SPOF
Redis/MQ
ここ...
あれ?
なんかめんどくさいぞ!
そもそもなんに使うんだっけ?
•リアルタイム通信
•Server Push
•チャットとか
•新着情報の通知
•リアルタイム通信(チャットとか)
ガチでやるならこういうのとか
<代替案>
•Server Push(新着情報)
ポーリングでええんちゃうか?
•普通のポーリング(short polling)
•普通のREST-APIでよい。
•ロングポーリング(long polling)
•普通のREST-API+Sleep付き無限...
ロングポーリング
<?php
while(true){
$someData = getSomeData();
if($someData){
break;
}
sleep(1);
}
echo $someData;
ミニマム実装はこれだけ。
まとめ
•WebSocketを実装する。
•気合をいれてインフラから考える
•または、メッセージング専用のインフラを検討する
★ポーリング/ロングポーリングでええやん!
★「リアルタイム」がほしいんや!
•そんなに「リアルタイム」でなくて良い場...
PHPの話が少なくて
スンマセン
ご清聴ありがとうございました
参考: 情報源
•http://qiita.com/yuba/items/00fc1892b296fb7b8de9
•http://d.hatena.ne.jp/susan-style/20140306/1394103655
•https://...
スタッフ募集中!
https://www.suzukishouten.co.jp/sp_top/index.html
https://www.wantedly.com/companies/suzukishouten/projects
Upcoming SlideShare
Loading in …5
×

PHPでWebSocketを実装してみてわかったこと

7,605 views

Published on

PHPカンファレンス関西2017発表資料。
--
Webでリアルタイム通信を実現するWebSocket。
WebSocketと言えば、Socket.IO(node)やActionCable(Rails5)なんかはメジャーですが、
さて、PHPではどうしましょうか。まだデファクトが無いですよね。
いろいろ調べて試してわかったことを、お伝えしたいと思います。

Published in: Software
  • Sex in your area is here: ♥♥♥ http://bit.ly/39pMlLF ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Follow the link, new dating source: ♥♥♥ http://bit.ly/39pMlLF ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (Unlimited) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... Download Full EPUB Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... ACCESS WEBSITE for All Ebooks ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... Download EPUB Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... Download doc Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

PHPでWebSocketを実装してみてわかったこと

  1. 1. PHPでWEBSOCKETを 実装してみてわかったこと 株式会社 鈴木商店 下地功一
  2. 2. 自己紹介 • 下地功一 • 株式会社 鈴木商店 • ドラえもんと犬が好き • 会社では「標準化」を担当 • ”オーシャン”と呼ばれてます
  3. 3. スタッフ募集中! https://www.suzukishouten.co.jp/sp_top/index.html https://www.wantedly.com/companies/suzukishouten/projects
  4. 4. WebSocket?
  5. 5. •Socket.IO(node) •ActionCable(Rails5) こういうやつやんな? ※こういうレベルから調査を始めました。
  6. 6. 本日お伝えしたいこと WebSocketおもろそうやん。 やってみよう! となることを共有。 あれ?
  7. 7. とりあえずサンプルを 動かしてみよう
  8. 8. 公式demo https://socket.io/demos/chat/ SOCKET.IO
  9. 9. サーバ側ソース(キモの部分) 基本的にこのレベルに抽象化されている
  10. 10. カンタン!
  11. 11. カンタン! ActionCableも試してみた ※省略
  12. 12. カンタンに動いてしまったので 結局よくわからん! どういうしくみ?
  13. 13. ざっと調べてみた GET wss://socketio-chat.now.sh/socket.io/?EIO=3&(略) Host: socketio-chat.now.sh Connection: Upgrade Pragma: no-cache Cache-Control: no-cache Upgrade: websocket Sec-WebSocket-Version: 13 Cookie: io=I_OoYe_ZK3tzDZwJADyp Sec-WebSocket-Key: Nyzgg2NNuwIWSASWgP/vEw== Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits Http Request WebSocketしたいねん! 次からWebSocketにアップグ レードたのむで!
  14. 14. ざっと調べてみた HTTP/1.1 101 Switching Protocols Date: Tue, 20 Jun 2017 07:24:48 GMT Connection: upgrade Upgrade: websocket Sec-WebSocket-Accept: /Nd/WozFqjHvDqh1XEkkDXm+JCw= Sec-WebSocket-Extensions: permessage-deflate Server: now Http Response WebSocketに切り替えたっ た!
  15. 15. chrome devtool
  16. 16. なんとなくわかった! ひょっとしてすぐ使える? PHPでも試してみよう!
  17. 17. ライブラリもある http://socketo.me/
  18. 18. サンプルコードの説明ページ メッセージキューがいる?
  19. 19. どうやらこんな構成らしい クライアント Web サーバプロセス WebSocket サーバプロセス メッセージキュー ※別のポート番号
  20. 20. なんとか 環境を作成! …面倒やな
  21. 21. Webサーバからの通知を送信する $context = new ZMQContext(); $socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'my pusher'); $socket->connect("tcp://localhost:5555"); $socket->send(json_encode($entryData)); キューに送信するだけなので プログラムはカンタン!
  22. 22. もうちょっとしらべてみた サーバをまたいで 通知 クライアントA ActionCableA ActionCableB Redis Pub/SubPub/Sub クライアントB ※まともに動かすためにはちゃんとインフラにも気を使わないといけない
  23. 23. 接続が切れる ページのリロード 新しいアプリケーションのデプロイ etc... そもそも繋がらない Http Proxy WebSocketを知らずに弾いちゃう ロードバランサ Upgradeが失敗する場合あり SPOF Redis/MQ ここクラスタ化するのはけっこう大変 状態を管理できない 誰が繋がってて、つながってないのか完全な管理は難しい 届いたかどうか保証されない メッセージが届く順番を制御できない さらに調べてみた…
  24. 24. あれ? なんかめんどくさいぞ!
  25. 25. そもそもなんに使うんだっけ? •リアルタイム通信 •Server Push •チャットとか •新着情報の通知
  26. 26. •リアルタイム通信(チャットとか) ガチでやるならこういうのとか <代替案>
  27. 27. •Server Push(新着情報) ポーリングでええんちゃうか? •普通のポーリング(short polling) •普通のREST-APIでよい。 •ロングポーリング(long polling) •普通のREST-API+Sleep付き無限ルー プでよい。 <代替案>
  28. 28. ロングポーリング <?php while(true){ $someData = getSomeData(); if($someData){ break; } sleep(1); } echo $someData; ミニマム実装はこれだけ。
  29. 29. まとめ •WebSocketを実装する。 •気合をいれてインフラから考える •または、メッセージング専用のインフラを検討する ★ポーリング/ロングポーリングでええやん! ★「リアルタイム」がほしいんや! •そんなに「リアルタイム」でなくて良い場合 •「通知」自体、補助的に使う程度の場合 ★あれ? •「チャットサンプル」は簡単、すぐ動く •ちゃんとやろうとすると「実はいろいろある」
  30. 30. PHPの話が少なくて スンマセン
  31. 31. ご清聴ありがとうございました
  32. 32. 参考: 情報源 •http://qiita.com/yuba/items/00fc1892b296fb7b8de9 •http://d.hatena.ne.jp/susan-style/20140306/1394103655 •https://gist.github.com/you21979/8a8dddf849a1a30e441e •http://qiita.com/m0a/items/f6405bc29073a7609050 •https://www.slideshare.net/You_Kinjoh/websocket-10621887 •https://gist.github.com/nulltask/89e6f36e194c951697a0 •http://postd.cc/websocket-shootout/ •https://api.slack.com/rtm •https://railsguides.jp/action_cable_overview.html •http://qiita.com/ynunokawa/items/564757fe6dbe43d172f8 •https://blog.ably.io/rails-5-actioncable-the-good-and-bad- parts-1b56c3b31404 あげるとキリがないのでこの辺で…
  33. 33. スタッフ募集中! https://www.suzukishouten.co.jp/sp_top/index.html https://www.wantedly.com/companies/suzukishouten/projects

×