Slide 1

Slide 1 text

©Fusic Co., Ltd. 1 PHPͰ࡞ΔWebSocketαʔόʔ ~ϦΞΫςΟϒͳΞϓϦέʔγϣϯΛ஌ΔͨΊʹ~ 2024.12.22 @seike460 PHP Conference Japan 2024

Slide 2

Slide 2 text

©Fusic Co., Ltd. 2 ਗ਼Ո ࢙࿠ @seike460 AWS Community Builder Serverless AWS User Group Leaders Community Organizer ɹFukuoka.php ɹFukuoka.go ɹJAWS-UG Fukuoka ɹServerless Meetup Fukuoka ɹCloudflare Meetup Fukuoka ɹJP_Stripes Fukuoka ࣗݾ঺հ ͸͡Ίʹ גࣜձࣾFusic ϓϦϯγύϧΤϯδχΞ/ΤόϯδΣϦετ

Slide 3

Slide 3 text

©Fusic Co., Ltd. 3 CONTENTS ໨࣍ 1. WebSocketϋϯυγΣΠΫ 2. WebSocketϑϨʔϜަ׵ 3. JavaScriptଆͷ࣮૷ 4. PHPଆͷ࣮૷ 5. σϞ 6. ·ͱΊ

Slide 4

Slide 4 text

©Fusic Co., Ltd. 4 WebSocketϋϯυγΣΠΫ 1

Slide 5

Slide 5 text

©Fusic Co., Ltd. 5 WebSocketͷ֓ཁ ૒ํ޲௨৴ 'VMM%VQMFY HTTP / 01 ίωΫγϣϯͷҡ࣋ 一 立 立 02 ௿Φʔόʔϔου HTTP 高 用 03 5

Slide 6

Slide 6 text

©Fusic Co., Ltd. 6 WebSocketϋϯυγΣΠΫ 6 Client server Request GET /chat HTTP/ 1 . 1 Host: example.com: 80 00 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub 2 5 jZQ== Sec-WebSocket-Version: 13 HTTP௨৴ͷҰͭͰ͸͋ΔͷͰɺ HTTPϔομʔΛ֬ೝ

Slide 7

Slide 7 text

©Fusic Co., Ltd. 7 WebSocketϋϯυγΣΠΫ 7 Client server Request GET /chat HTTP/ 1 . 1 Host: example.com: 80 00 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub 2 5 jZQ== Sec-WebSocket-Version: 13 GETͰɺ/chatʹɺHTTP/1.1Ͱ઀ଓ Hostͷexample.comʹରͯ͠8000൪ϙʔτͰ઀ଓ

Slide 8

Slide 8 text

©Fusic Co., Ltd. 8 WebSocketϋϯυγΣΠΫ 8 Client server Request GET /chat HTTP/ 1 . 1 Host: example.com: 80 00 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub 2 5 jZQ== Sec-WebSocket-Version: 13 HTTP͔ΒWebSocket΁ͷϓϩτίϧ੾Γସ͑Λཁٻ ʮ੾Γସ͍͑ͨϓϩτίϧͷछྨʯΛࢦఆ

Slide 9

Slide 9 text

©Fusic Co., Ltd. 9 WebSocketϋϯυγΣΠΫ 9 Client server Request GET /chat HTTP/ 1 . 1 Host: example.com: 80 00 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub 2 5 jZQ== Sec-WebSocket-Version: 13 ϓϩτίϧͷΞοϓάϨʔυΛࣔ͢ ʮϓϩτίϧΛ੾Γସ͑ΔҙࢥʯΛ఻͑Δ Connection: closeͳͲ΋͋Δʢ઀ଓΛऴྃ͢Δҙࢥʣ

Slide 10

Slide 10 text

©Fusic Co., Ltd. 10 WebSocketϋϯυγΣΠΫ 10 Client server Request GET /chat HTTP/ 1 . 1 Host: example.com: 80 00 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub 2 5 jZQ== Sec-WebSocket-Version: 13 16όΠτҎ্ΛBase64Τϯίʔυͨ͠΋ͷ ΫϥΠΞϯτ͕͜ͷ஋Λࣗ༝ʹੜ੒Մೳ ੜ੒نଇ͕ఆΊΒΕ͍ͯΔΘ͚Ͱ͸͋Γ·ͤΜ

Slide 11

Slide 11 text

©Fusic Co., Ltd. 11 WebSocketϋϯυγΣΠΫ 11 Client server Request GET /chat HTTP/ 1 . 1 Host: example.com: 80 00 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub 2 5 jZQ== Sec-WebSocket-Version: 13 WebSocketͷVersionΛࣔ͠·͢ αʔόʔ͕ड৴ͨ͠σʔλΛղऍग़དྷΔ͔֬ೝ ղऍͰ͖ͳ͍৔߹͸઀ଓΛ҆શʹऴྃ͢Δ

Slide 12

Slide 12 text

©Fusic Co., Ltd. 12 WebSocketϋϯυγΣΠΫ 12 Client server Response Request HTTP/ 1 . 1 1 01 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s 3 pPLMBiTxaQ 9 kYGzzhZRbK+xOo= RequestΛड͚ͯɺServer͕ResponseΛฦ٫

Slide 13

Slide 13 text

©Fusic Co., Ltd. 13 WebSocketϋϯυγΣΠΫ 13 Client server Response Request HTTP/ 1 . 1 1 01 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s 3 pPLMBiTxaQ 9 kYGzzhZRbK+xOo= 101 Switching Protocolsͱͯ͠ɺ Clientͷཁٻͨ͠Protocolʹ੾Γସ͑ΔࣄΛྃঝɺฦ౴

Slide 14

Slide 14 text

©Fusic Co., Ltd. 14 WebSocketϋϯυγΣΠΫ 14 Client server Response Request HTTP/ 1 . 1 1 01 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s 3 pPLMBiTxaQ 9 kYGzzhZRbK+xOo= Requestͱಉ༷ WebSocketʹUpgrade͢Δ͜ͱΛฦ౴

Slide 15

Slide 15 text

©Fusic Co., Ltd. 15 WebSocketϋϯυγΣΠΫ 15 Client server Response Request HTTP/ 1 . 1 1 01 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s 3 pPLMBiTxaQ 9 kYGzzhZRbK+xOo= ᶃΫϥΠΞϯτ͕ Sec-WebSocket-Key ͱͯ͠ૹ৴

Slide 16

Slide 16 text

©Fusic Co., Ltd. 16 WebSocketϋϯυγΣΠΫ 16 Client server Response Request HTTP/ 1 . 1 1 01 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s 3 pPLMBiTxaQ 9 kYGzzhZRbK+xOo= ᶃΫϥΠΞϯτ͕ Sec-WebSocket-Key ͱͯ͠ૹ৴ ᶄWebSocket࢓༷Ͱఆٛ͞ΕͨݻఆGUIDΛ࿈݁ 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 ↓ dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11

Slide 17

Slide 17 text

©Fusic Co., Ltd. 17 WebSocketϋϯυγΣΠΫ 17 Client server Response Request HTTP/ 1 . 1 1 01 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s 3 pPLMBiTxaQ 9 kYGzzhZRbK+xOo= ᶃΫϥΠΞϯτ͕ Sec-WebSocket-Key ͱͯ͠ૹ৴ ᶄWebSocket࢓༷Ͱఆٛ͞ΕͨݻఆGUIDΛ࿈݁ ᶅ࿈݁ͨ͠จࣈྻΛSHA-1ͰϋογϡԽ b"\xB3z\xCB0\x98O\x16\x90\xF6F\x18\xCE\x38Y\x16\xB2\x94\xEA\x82\x9F"

Slide 18

Slide 18 text

©Fusic Co., Ltd. 18 WebSocketϋϯυγΣΠΫ 18 Client server Response Request HTTP/ 1 . 1 1 01 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s 3 pPLMBiTxaQ 9 kYGzzhZRbK+xOo= ᶃΫϥΠΞϯτ͕ Sec-WebSocket-Key ͱͯ͠ૹ৴ ᶄWebSocket࢓༷Ͱఆٛ͞ΕͨݻఆGUIDΛ࿈݁ ᶅ࿈݁ͨ͠จࣈྻΛSHA-1ͰϋογϡԽ ᶆϋογϡԽ͞Εͨ݁ՌΛBase64ͰΤϯίʔυ s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Slide 19

Slide 19 text

©Fusic Co., Ltd. 19 WebSocketϑϨʔϜͷߏ଄ 2

Slide 20

Slide 20 text

©Fusic Co., Ltd. 20 WebSocketϑϨʔϜ 20 Client server Response Request 8 1 85 37 FA 2 1 3 D 7 F 9 F 4 D 5 1 5 8 - Socket௨৴ - ωοτϫʔΫ্ͰσʔλΛૹड৴͢Δ࢓૊Έ ΫϥΠΞϯτͱαʔόʔؒͷ૒ํ޲௨৴Λ࣮ݱ - WebSocketϑϨʔϜ - SocketͷதͰWebSocketϑϨʔϜΛަ׵ ϔομʔ΍ϖΠϩʔυʢ࣮ࡍͷσʔλʣΛ௨৴

Slide 21

Slide 21 text

©Fusic Co., Ltd. 21 WebSocketϑϨʔϜ 21 Client server Response Request 8 1 85 37 FA 2 1 3 D 7 F 9 F 4 D 5 1 5 8 ϋϯυγΣΠΫ׬ྃޙɺΫϥΠΞϯτͱαʔόʔ͸ ্هͷΑ͏ͳόΠφϦσʔλͷަ׵Λߦ͍·͢ ϝοηʔδ͕ "Hello" ͷ৔߹ 81: FIN=1, OPCODE=1 (ςΩετϑϨʔϜ) 85: MASK=1, ϖΠϩʔυ௕=5 37 FA 21 3D: ϚεΫΩʔ 7F 9F 4D 51 58: ϚεΫ͞Εͨσʔλ

Slide 22

Slide 22 text

©Fusic Co., Ltd. 22 WebSocketϑϨʔϜ 22 Client server Response Request 8 1 85 37 FA 2 1 3 D 7 F 9 F 4 D 5 1 5 8 81: FIN=1, OPCODE=1 (ςΩετϑϨʔϜ) FIN=1ͷ৔߹͸ɺ͜ͷϑϨʔϜ͕ϝοηʔδͷ࠷ޙ FIN=0ͷ৔߹͸ɺ·ͩଓ͖ͷϑϨʔϜ͕͋ΔࣄΛࣔ͢ OPCODE=1ͳͷͰςΩετϑϨʔϜͰ͋ΔࣄΛࣔ͢ ϝοηʔδͷ࠷ޙͷςΩετϑϨʔϜͰ͋Δ

Slide 23

Slide 23 text

©Fusic Co., Ltd. 23 WebSocketϑϨʔϜ 23 Client server Response Request 8 1 85 37 FA 2 1 3 D 7 F 9 F 4 D 5 1 5 8 81: FIN=1, OPCODE=1 (ςΩετϑϨʔϜ) OPCODE (4Ϗοτ)ʹ͸ҎԼͷϑϨʔϜ͕͋Γ·͢ 0x1: ςΩετϑϨʔϜ 0x2: όΠφϦϑϨʔϜ 0x8: ઀ଓͷऴྃ 0x9: Ping 0xA: Pong

Slide 24

Slide 24 text

©Fusic Co., Ltd. 24 WebSocketϑϨʔϜ 24 Client server Response Request 8 1 85 37 FA 2 1 3 D 7 F 9 F 4 D 5 1 5 8 85: MASK=1, ϖΠϩʔυ௕=5 MASK (1Ϗοτ):σʔλ͕ϚεΫ͞Ε͍ͯΔ͔Λࣔ͢ ΫϥΠΞϯτ͔Βૹ৴͞ΕΔϑϨʔϜ͸ ඞͣϚεΫ͞Ε͍ͯΔ (1) αʔόʔ͔ΒͷϑϨʔϜ͸௨ৗϚεΫ͞Εͳ͍ (0)

Slide 25

Slide 25 text

©Fusic Co., Ltd. 25 WebSocketϑϨʔϜ 25 Client server Response Request 8 1 85 37 FA 2 1 3 D 7 F 9 F 4 D 5 1 5 8 85: MASK=1, ϖΠϩʔυ௕=5 Payload Len (7Ϗοτ) :ϖΠϩʔυͷ௕͞Λࣔ͢ 0 ~ 125: ࣮ࡍͷϖΠϩʔυ௕ 126: ࣍ͷ2όΠτ͕ϖΠϩʔυ௕Λࣔ͢(16Ϗοτ੔਺) 127: ࣍ͷ8όΠτ͕ϖΠϩʔυ௕Λࣔ͢(64Ϗοτ੔਺)

Slide 26

Slide 26 text

©Fusic Co., Ltd. 26 WebSocketϑϨʔϜ 26 Client server Response Request 8 1 85 37 FA 2 1 3 D 7 F 9 F 4 D 5 1 5 8 37 FA 21 3D: ϚεΫΩʔ Masking Key (4όΠτ):ϖΠϩʔυσʔλΛ ϚεΫ͢ΔͨΊͷϥϯμϜͳΩʔ ΫϥΠΞϯτૹ৴࣌ͷΈؚ·ΕΔʢޮ཰Խͷҝʣ αʔόʔଆ͸ϚεΫΩʔΛऔಘͯ͠ϚεΫղআ͢Δ தؒϓϩΩγ͕σʔλΛޡղऍ͠ͳ͍Α͏ʹ ϚεΫΛద༻

Slide 27

Slide 27 text

©Fusic Co., Ltd. 27 WebSocketϑϨʔϜ 27 Client server Response Request 8 1 85 37 FA 2 1 3 D 7 F 9 F 4 D 5 1 5 8 7F 9F 4D 51 58ɿPayload Data (ϚεΫ͞Εͨσʔλ) ϚεΫ͞ΕͨσʔλͰ͢ HelloΛϚεΫΩʔΛར༻ͯ͠XORԋࢉ͞Ε͓ͯΓɺ αʔόʔ͸ϧʔϧʹج͍ͮͯϚεΫΛղআͯ͠ɺ ϖΠϩʔυΛར༻͠·͢

Slide 28

Slide 28 text

©Fusic Co., Ltd. 28 ௕͍ϖΠϩʔυ (>125όΠτ) ͷ WebSocket ϑϨʔϜ 28 Client server Response Request 8 1 FE 00 C 8 1 2 34 5 6 7 8 125όΠτΑΓ௕͍ϖΠϩʔυͷ৔߹ɺ ϔομʔͱϖΠϩʔυΛ෼ׂ ҎԼ͸126όΠτͣͭɺ200όΠτͷσʔλΛૹ৴ 81: FIN=1, OPCODE=1ʢςΩετϑϨʔϜʣ FE: MASK=1, ϖΠϩʔυ௕=126 00 C8: ֦ுϖΠϩʔυ௕=200ɹ 12 34 56 78: ϚεΫΩʔ

Slide 29

Slide 29 text

©Fusic Co., Ltd. 29 PingϑϨʔϜ 29 Client server Response Request 8 9 81 12 34 56 78 89: FIN=1, OPCODE=9ʢPingϑϨʔϜʣ 81: MASK=1, ϖΠϩʔυ௕=1 12 34 56 78: ϚεΫΩʔ ϖΠϩʔυ͸ͳ͠

Slide 30

Slide 30 text

©Fusic Co., Ltd. 30 σϞ 3

Slide 31

Slide 31 text

©Fusic Co., Ltd. 31 JavaScriptଆͷ࣮૷ ઀ଓʹདྷͨϢʔβʔͷϝοηʔδ͕ɺଞͷਓͷϒϥ΢βʹ఻ΘΔ http://࣮ࡍͷࢿྉʹ͚ͩషΓ෇͚͍ͯ·͢

Slide 32

Slide 32 text

©Fusic Co., Ltd. 32 ιʔείʔυ͸ެ։͍ͯ͠·͢ https://github.com/seike460/php-websocket-original ొஃલʹXʹϙετ͍ͯ͠·͢ͷͰɺ ͥͻʮwebsokects.phpʯΛࢀর͠ͳ͕Β ௌߨ௖͚·͢ͱ޾͍Ͱ͢ σϞʹ͍͖·͢

Slide 33

Slide 33 text

©Fusic Co., Ltd. 33 JavaScriptଆͷ࣮૷ 4

Slide 34

Slide 34 text

©Fusic Co., Ltd. 34 JavaScriptଆͷ࣮૷ const WEBSOCKET_URL = "ws://localhost:8080" socket = new WebSocket(WEBSOCKET_URL) socket.send(payload) -> ઀ଓઌͷSocket΁ॻ͖ࠐΈ(PHPαʔόʔʹॻࠐΈ) socket.onopen = function (event) {} WebSocketͷ઀ଓ͕੒ޭͨ͠ͱ͖ʹݺͼग़͞Ε·͢ socket.onmessage = function (event) {} αʔόʔ͔ΒϝοηʔδΛड৴ͨ͠ͱ͖ʹݺͼग़͞Ε·͢ socket.onerror = function (error) {} WebSocket઀ଓͰΤϥʔ͕ൃੜͨ͠ͱ͖ʹݺͼग़͞Ε·͢ socket.onclose = function (event) {} WebSocket઀ଓ͕ด͡ΒΕͨͱ͖ʹݺͼग़͞Ε·͢

Slide 35

Slide 35 text

©Fusic Co., Ltd. 35 JavaScriptଆͷ࣮૷ socket.onopen = function (event) {} WebSocketͷ઀ଓ͕੒ޭͨ͠ͱ͖ʹݺͼग़͞Ε·͢ eventΦϒδΣΫτͷத਎ʹ͸ҎԼ͕ೖ͍ͬͯ·͢

Slide 36

Slide 36 text

©Fusic Co., Ltd. 36 JavaScriptଆͷ࣮૷ socket.onmessage = function (event) {} αʔόʔ͔ΒϝοηʔδΛड৴ͨ͠ͱ͖ʹݺͼग़͞Ε·͢ eventΦϒδΣΫτͷத਎ʹ͸ҎԼ͕ೖ͍ͬͯ·͢

Slide 37

Slide 37 text

©Fusic Co., Ltd. 37 JavaScriptଆͷ࣮૷ socket.onerror = function (error) {} WebSocket઀ଓͰΤϥʔ͕ൃੜͨ͠ͱ͖ʹݺͼग़͞Ε·͢ ErrorΦϒδΣΫτͷத਎ʹ͸ҎԼ͕ೖ͍ͬͯ·͢

Slide 38

Slide 38 text

©Fusic Co., Ltd. 38 JavaScriptଆͷ࣮૷ socket.onclose = function (event) {} WebSocket઀ଓ͕ด͡ΒΕͨͱ͖ʹݺͼग़͞Ε·͢ eventΦϒδΣΫτͷத਎ʹ͸ҎԼ͕ೖ͍ͬͯ·͢

Slide 39

Slide 39 text

©Fusic Co., Ltd. 39 PHPଆͷ࣮૷ 5

Slide 40

Slide 40 text

©Fusic Co., Ltd. 40 αʔόʔͷॳظԽ

Slide 41

Slide 41 text

©Fusic Co., Ltd. 41 αʔόʔͷॳظԽ socket_create:ιέοτΛ࡞੒ ɹAF_INET: IPv4Λ࢖༻ ɹSOCK_STREAM: TCPϓϩτίϧΛࢦఆ ɹSOL_TCP: ιέοτͷλΠϓ

Slide 42

Slide 42 text

©Fusic Co., Ltd. 42 αʔόʔͷॳظԽ socket_set_option:ιέοτΦϓγϣϯΛઃఆ ɹSO_REUSEADDR: ϙʔτͷ࠶ར༻ΛڐՄ

Slide 43

Slide 43 text

©Fusic Co., Ltd. 43 αʔόʔͷॳظԽ socket_bind:ࢦఆ͞ΕͨIPΞυϨεͱϙʔτʹιέοτΛόΠϯυ

Slide 44

Slide 44 text

©Fusic Co., Ltd. 44 αʔόʔͷॳظԽ socket_listen:ιέοτΛϦοεϯঢ়ଶʹ͠ɺΫϥΠΞϯτ઀ଓΛ଴ͪड͚ ɹ଴ͪड͚ΔΫϥΠΞϯτͷ਺(=$maxClients)͸5 ʹͯ͠·͢

Slide 45

Slide 45 text

©Fusic Co., Ltd. 45 ϝΠϯϧʔϓʢ઀ଓ଴ͪʣ

Slide 46

Slide 46 text

©Fusic Co., Ltd. 46 ϝΠϯϧʔϓʢ઀ଓ଴ͪʣ socket_select:઀ଓιέοτʢಡΈऔΓՄೳͳιέοτʣΛ؂ࢹ ɹಡΈऔΓՄೳʢ$readʣ: ιέοτʹड৴σʔλ͕͋ΓɺಡΈऔΕΔ ɹॻ͖ࠐΈՄೳʢ$writeʣ: ιέοτ͕ॻ͖ࠐΈՄೳ ɹΤϥʔൃੜʢ$exceptʣ: ιέοτʹΤϥʔ͕ൃੜ ɹλΠϜΞ΢τʢnullʣ:λΠϜΞ΢τ͢Δඵ਺ɹ˞ࠓճ͸ແݶ

Slide 47

Slide 47 text

©Fusic Co., Ltd. 47 ϝΠϯϧʔϓʢ઀ଓ଴ͪʣ socket_acceptɿ৽نΫϥΠΞϯτ઀ଓͷड͚ೖΕ αʔόʔιέοτʢ$serverʣ͕ಡΈऔΓՄೳͷ৔߹ɺ ৽͍͠ΫϥΠΞϯτ઀ଓΛड͚ೖΕ ৽͍͠ιέοτʢΫϥΠΞϯτʣΛ $clients ഑ྻʹ௥Ճ

Slide 48

Slide 48 text

©Fusic Co., Ltd. 48 σʔλड৴(σίʔυ)ͱϋϯυγΣΠΫ

Slide 49

Slide 49 text

©Fusic Co., Ltd. 49 σʔλड৴(σίʔυ)ͱϋϯυγΣΠΫ socket_recvɿΫϥΠΞϯτιέοτ͔ΒσʔλΛड৴ ड৴σʔλ͕ͳ͍৔߹($bytes === 0) ΫϥΠΞϯτ͕੾அ͞ΕͨͱΈͳ͠ιέοτΛด͡Δ

Slide 50

Slide 50 text

©Fusic Co., Ltd. 50 σʔλड৴(σίʔυ)ͱϋϯυγΣΠΫ ■·ͩHandshakeͯ͠ͳ͍Client͔Βͷ௨৴ -> Handshakeཁٻ WebSocket઀ଓͷॳظஈ֊ͰHTTP͔ΒWebSocket΁ͷϓϩτίϧ੾Γସ͑ ࣗ࡞ͷperformHandshake ؔ਺ʢޙड़ʣͰHandshakeΛ࣮ࢪ ■HandshakeࡁΈͷClient͔Βͷ௨৴ -> σʔλ͕ૹ৴͞Ε͖͍ͯͯΔ WebSocketͷϑϨʔϜΛdecodeؔ਺ʢޙड़ʣΛར༻ͯ͠ཧղͰ͖ΔΑ͏ʹ

Slide 51

Slide 51 text

©Fusic Co., Ltd. 51 ΫϥΠΞϯτ͔ΒͷσʔλΛશΫϥΠΞϯτ΁ૹ৴

Slide 52

Slide 52 text

©Fusic Co., Ltd. 52 ΫϥΠΞϯτ͔ΒͷσʔλΛશΫϥΠΞϯτ΁ૹ৴ ͜͜͸γϯϓϧʹΫϥΠΞϯτ͔Βड͚औͬͨϖΠϩʔυΛՃ޻ͯ͠ɺ ଞͷΫϥΠΞϯτͷSocketʹॻ͖ࠐΈ·͢ ͦ͏͢Δ͜ͱͰɺผͷϒϥ΢βʹॻ͖ࠐ·Εͨσʔλ͕දࣔ͞Ε·͢

Slide 53

Slide 53 text

©Fusic Co., Ltd. 53 ϋϯυγΣΠΫؔ਺

Slide 54

Slide 54 text

©Fusic Co., Ltd. 54 ϋϯυγΣΠΫؔ਺ ·ͣ͸Sec-WebSocket-Key͕ඞͣ͋Δ͸ͣͳͷͰऔಘ ͳ͍৔߹͸ෆਖ਼ͳ௨৴ͳͷͰSocketΛด͡Δ

Slide 55

Slide 55 text

©Fusic Co., Ltd. 55 ϋϯυγΣΠΫؔ਺ ͦͷޙऔಘͨ͠Sec-WebSocket-KeyͱGUIDΛ݁߹ͯ͠SHA-1ͰϋογϡԽ

Slide 56

Slide 56 text

©Fusic Co., Ltd. 56 ϋϯυγΣΠΫؔ਺ ϋογϡԽͨ͠ΩʔͱɺඞཁͳϔομʔΛ෇༩ͯ͠௨৴͖ͯͨ͠ ΫϥΠΞϯτʹResponse͢Δҝʹɺsocket_writeΛߦ͏

Slide 57

Slide 57 text

©Fusic Co., Ltd. 57 ड৴σʔλͷσίʔυ

Slide 58

Slide 58 text

©Fusic Co., Ltd. 58 ड৴σʔλͷσίʔυ ord($data[1]) & 127 ͰجຊϖΠϩʔυ௕Λऔಘ 126 ·ͨ͸ 127 ͷ৔߹ʹ֦ுϖΠϩʔυ௕ΛಡΈऔΔ ֦ுϖΠϩʔυ௕ͷޙʹ͋Δ ϚεΫΩʔʢ4όΠτʣ ΛಡΈऔΓɺ ϖΠϩʔυσʔλ։࢝ҐஔΛܭࢉ

Slide 59

Slide 59 text

©Fusic Co., Ltd. 59 ड৴σʔλͷσίʔυ ϑϨʔϜͷϔομʔ෦෼ΛεΩοϓ͠ɺ $payloadOffset ͷҐஔ͔ΒϖΠϩʔυσʔλΛऔಘ for จͰϖΠϩʔυͷ֤όΠτΛϚεΫΩʔͱ XORԋࢉ $unmaskedPayload ʹ෮߸σʔλΛߏங

Slide 60

Slide 60 text

©Fusic Co., Ltd. 60 WebSocket͸ࢥͬͨΑΓ΋γϯϓϧͳ௨৴ WebSocketͱ͍͏௨৴͸ʮϦΞϧλΠϜ௨৴ʯͱݴΘΕΔ෼ ෳࡶͩͱײ͍ͯ͡Δํ͍Βͬ͠ΌΔ͔΋Ͱ͕͢ɺ ࢥ͍ͷ֎ɺHTTP௨৴ͷཁૉ͕େ͖͔ͬͨͰ͢ WebSocketΛ਎ۙʹɺϦΞΫςΟϒͳPHPΛߏங͠·͠ΐ͏

Slide 61

Slide 61 text

©Fusic Co., Ltd. 61 ͱ͸͍͑… ੈͷதʹ͸ศརͳOSS͕͋Γ·͢ͷͰɺجຊతʹͦͪΒΛར༻͠·͠ΐ͏ PHP͕࢖͑Δ΋ͷͳΒ https://github.com/walkor/workerman ͳͲ Amazon API Gateway ΋WebSocketରԠͯ͠ΔͷͰ AWS Lambda + BrefͳσϞ΋࡞੒ࡁΈͰ͢ͷͰ߹Θͤͯࢼͯ͠ݟ͍ͯͩ͘͞

Slide 62

Slide 62 text

©Fusic Co., Ltd. 62 Ϋϥ΢υʹ·͔ͤͪΌ͏ͷ΋ख Amazon API Gateway ΋WebSocketରԠͯ͠ΔͷͰ AWS Lambda + BrefͳσϞ͕࡞੒ग़དྷΔϦϙδτϦ΋͋Γ·͢ͷͰ ࢼͯ͠Έ͍ͯͩ͘͞ https://github.com/seike460/php-websocket-bref

Slide 63

Slide 63 text

©Fusic Co., Ltd. 63 ·ͱΊ 5

Slide 64

Slide 64 text

©Fusic Co., Ltd. 64 ·ͱΊ WebSocket͸૒ํ޲ʹϦΞϧλΠϜ௨৴Ͱ͖ΔɺϦΞΫςΟϒͳΞϓϦʔέʔγϣϯʹదͨ͠ϓϩτίϧ࢓༷ Point 01 WebSocketͷ௨৴ࣗମ͸ཧղ͢Ε͹HTTPͷԆ௕ͱͯ͠ѻ͑Δɻंྠͷ࠶ൃ໌ʹͯ௨৴࢓༷Λཧղ Point 02 ࣮ࡍ͸ https://github.com/walkor/workerman ͳͲ͕Φεεϝ Point 03 Ϋϥ΢υʹ·͔ͤͯ͠·͏ͷ΋Ұͭͷखஈɺ༷ʑͳબ୒ࢶΛ࣋ͪ·͠ΐ͏ Point 04

Slide 65

Slide 65 text

©Fusic Co., Ltd. 65 Thank You We are Hiring! https://recruit.fusic.co.jp/ ͝ਗ਼ௌ͍͖ͨͩ͋Γ͕ͱ͏͍͟͝·ͨ͠