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.

Ratchetでweb socketを使ってみたよ.d0131.pub

840 views

Published on

PHP勉強会東京 発表資料

Published in: Internet
  • Be the first to comment

  • Be the first to like this

Ratchetでweb socketを使ってみたよ.d0131.pub

  1. 1. RatchetでWebSocketを 使ってみたよLT tDash 2018/1 https://twitter.com/tDash0
  2. 2. 自己紹介 • tDash • フリーランス • PHPは3.1のころから • Javaも使う SringBootがスキ
  3. 3. 質問1 WebSocket知ってるひと ↓ 8割位知ってた
  4. 4. 質問2 PHP Ratchet知ってるひと ↓ 知ってる人いなかった
  5. 5. WebSocketとは • 非同期通信のプロトコル • HTTP1.1をアップデートして使う
  6. 6. WebSocketじゃない通信1
  7. 7. WebSocketじゃない通信2
  8. 8. WebSocketじゃない通信3 レスポンスを受けたら 接続は切れる
  9. 9. WebSocketだと1
  10. 10. WebSocketだと2
  11. 11. WebSocketを使えば チャットアプリとか
  12. 12. WebSocketを使えば • リアルタイムオンライン対戦ゲーム • 閲覧者数表示とか • Webページ上のチャットとか • を作ることができる
  13. 13. クライアントでWebSocketを使うには •WebSocketに対応しているブラウザ •Internet Explorer 10 •Firefox 6 •Google Chrome 4 •Safari 5 •Opera 12.10 •Unity3Dでも使える
  14. 14. サーバーでWebSocketを使うには •サーバー側でhttp通信を受ける常駐し て動作するプログラムが必要 •Node.js •Tomcat(Java) •Ratchet(PHP) •ほか多数
  15. 15. PHPだとRatchetを使うとWebSocketを使える • http://socketo.me
  16. 16. サーバー内構成
  17. 17. Nginxの設定
  18. 18. Ratchetのインストールはcomposerでかんたん • composer require cboden/ratchet
  19. 19. 書き方(起動箇所) • <?php use RatchetServerIoServer; use RatchetHttpHttpServer; use RatchetWebSocketWsServer; use MyPingPing; require dirname(__DIR__) . ‘/vendor/autoload.php’; $server = IoServer::factory( new HttpServer( new WsServer( new Ping() ← イベントの処理をするクラス ) ), 12957 ← つかうポート番号を指定する ); $server->run();
  20. 20. 書き方(イベント処理) • 接続 • メッセージ受信 • 切断 • のイベントを処理するクラスを書く。
  21. 21. onOpen クライアントから接続されたら onOpen が呼ばれる。 コネクションクラスをコネクションプールに登録。
  22. 22. onMessage クライアントからメッセージが来たら onMessageメソッドが呼ばれる。 コネクションプールの対象となるコネクションにメッセージを送る。 チャットだったら同じ部屋にいるメンバー全員にメッセージを送るなど。
  23. 23. onClose 切断されたら onCloseメソッドが呼ばれる。
  24. 24. しかし実際に使うには • メッセージのキューイングとか複雑な処理が必要 • 過去のメッセージはDBやKVSに格納する機能を作らないといけない • 改ざん防止機能とか • ログイン機能とか • NginxやApacheとの連携機能(プロクシ) • いろんな機能を作らないといけない
  25. 25. よし!チャットを作ったぞ • 土日と年末年始の2週間くらいで 作った。 • クライアントはWebアプリを作って CorodavaでiOSとAndroidアプリに した。
  26. 26. だが!しかし!
  27. 27. オレは Java で作った JAVA!
  28. 28. なぜJavaにしたのか • PHP7.1はJavaっぽくなってるんだけど、微妙にちがってもどかしい。そ れならいっそJavaにすればいいじゃん! • オブジェクト指向はやっぱりJava • 絶対的安心感 • OR Mapper MyBATISが良い。SQL直接書ける。賢いデータマッピング。 • Spring賢い。SpringBoot すごく整ってる。 • でもSpring + MyBatis + StrutsをXMLで 設定するのは超大変。 • mavenいいね。Composerみたいなもの。うーんcomposerよりいいなぁ。
  29. 29. JavaとRatchetでの速度比較 • メッセージ1000回送信するのに •SpringBootだと 12.082秒 •Ratchetだと 9.343秒 • なんとRatchetの方が早い。 • 単純な動作だけ • なんでだろ どこかのJARが悪いのか? • http://localhost:8888/wsping/index.html
  30. 30. telnetでのWebSocket接続テスト CONNECT localhost:12958 HTTP/1.1 GET ws://localhost:12958/ping/ HTTP/1.1 Host: localhost:12958 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: ae5b468c7707a1f3d36c49b1fe2ef850= Sec-WebSocket-Version: 13
  31. 31. curlでのWebSocket接続テスト curl -i -N -H "Connection: keep-alive, Upgrade" -H "Upgrade: websocket" -H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Extensions: deflate-stream" -H "Sec-WebSocket-Key:ae5b468c7707a1f3d36c49b1fe2ef850==" -H "Host: dummylocal:12958" -H "Origin:http://dummylocal:12958" http://dummylocal:12958/ping/ unsupported WebSocket version: 8.
  32. 32. ご清聴ありがとうございました • オレはやっぱりJavaとC言語がすき

×