31
CREATING REALTIME CREATING REALTIME APPLICATIONS WITH PHP APPLICATIONS WITH PHP AND WEBSOCKETS AND WEBSOCKETS · Corey Ballou @cballou

Creating Realtime Applications with PHP and Websockets

Embed Size (px)

DESCRIPTION

Follow me on Twitter at http://www.twitter.com/cballou or checkout my startup at http://www.pop.co. In this presentation we will overview the latest WebSockets spec before jumping into multiple interactive demos of increasing complexity utilizing the open source Ratchet library provided by React PHP. By the end of the presentation, you'll walk away with access to a github repository containing all of the presentation slides and demos ready to run yourself! Sorry about the slides spanning multiple pages; Reveal.js print to pdf had problems! https://github.com/cballou/php-websockets-demos

Citation preview

Page 1: Creating Realtime Applications with PHP and Websockets

CREATING REALTIME

CREATING REALTIME

CREATING REALTIMEAPPLICATIONS WITH PHP

APPLICATIONS WITH PHP

APPLICATIONS WITH PHPAND WEBSOCKETS

AND WEBSOCKETS

AND WEBSOCKETS · Corey Ballou @cballou

Page 2: Creating Realtime Applications with PHP and Websockets

SO... WHAT ARE WEBSOCKETS?Full-duplex client/server communication over TCPHackery piggybacking on HTTP handshake

, an official protocol!

RFC6455

Page 3: Creating Realtime Applications with PHP and Websockets

OK... BUT WHY USE WEBSOCKETS?Optimized for low latency applicationsCross-origin communicationNo more AJAX pollingBecause it's flashy

Page 4: Creating Realtime Applications with PHP and Websockets
Page 5: Creating Realtime Applications with PHP and Websockets

WEBSOCKETS PROTOCOL HISTORY. BORING!TLDR; It's mostly security enhancements.

Pro tip: · · · · · · · · · ·

· · · ·

you can check RFC diffs on the IETF site

Hixie-75 v Hixie-76 Hixie-75 v Hybi-00 Hixie-75 v Hybi-07 Hixie-75 v Hybi-10 Hixie-75 v RFC6455 Hixie-76 v Hybi-00 Hixie-76 v Hybi-07 Hixie-76 v Hybi-10 Hixie-76 v RFC6455 Hybi-00 v Hybi-07Hybi-00 v Hybi-10 Hybi-00 v RFC6455 Hybi-07 v Hybi-10 Hybi-07 v RFC6455 Hybi-10 v RFC6455

Page 6: Creating Realtime Applications with PHP and Websockets

LET'S TALK HTTP OVERHEADREQUEST

RESPONSE

Page 7: Creating Realtime Applications with PHP and Websockets
Page 8: Creating Realtime Applications with PHP and Websockets

LET'S TALK PERFORMANCECompare vs. AJAX polling using the previous slide.

(and assume AJAX polling every second vs. receiving a WebSocket message every second)

Clients HTTP Throughput WS Throughput Difference1,000 1.56 MB 0.002 MB 780x10,000 15.26 MB 0.019 MB 803x100,000 152.59 MB 0.191 MB 799x

Page 9: Creating Realtime Applications with PHP and Websockets

CLIENT REQUEST SERVER RESPONSE

THE WEBSOCKET HTTP HANDSHAKE

Only incur HTTP header overhead on the initial handshake.

GET /endpoint HTTP/1.1Origin: http://example.comHost: server.example.comUpgrade: WebSocketConnection: UpgradeSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==Sec-WebSocket-Version: 13[...]

HTTP/1.1 101 Switching ProtocolsUpgrade: WebSocketConnection: UpgradeSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=[...]

Page 10: Creating Realtime Applications with PHP and Websockets

BROWSER SUPPORT: STILL SHODDYBECAUSE WE ALL HAVE TO DEAL WITH BACKWARDS COMPATIBILITY...

Page 12: Creating Realtime Applications with PHP and Websockets

CLIENT SIDE: HTML5 JS APIvar socket = new WebSocket('ws://localhost:8000/socketServer.php');socket.onopen = function() { console.log('Socket status: ' + socket.readyState); // send message to socket server socket.send('Hello, world!'); // close connection socket.close();};

socket.onmessage = function(msg) { console.log(msg.data); };socket.onclose = function() { };socket.onerror = function() { };

Page 13: Creating Realtime Applications with PHP and Websockets

SERVER SIDE: RATCHET ROCKSRatchet is a loosely coupled PHP library providing developers

with tools to create real time, bi-directional applicationsbetween clients and servers over WebSockets.

use Ratchet\MessageComponentInterface;use Ratchet\ConnectionInterface;use Ratchet\Server\IoServer;use Ratchet\WebSocket\WsServer;

class MyWsServer implements MessageComponentInterface { public function onOpen(ConnectionInterface $conn) { } public function onMessage(ConnectionInterface $conn, $msg) { } public function onClose(ConnectionInterface $conn) { } public function onError(ConnectionInterface $conn, \Exception $e) { }}

$server = IoServer::factory(new WsServer(new MyWsServer()), 8090);$server->run();

Page 14: Creating Realtime Applications with PHP and Websockets

RATCHET SUPPORTS THE WAMP SUB-PROTOCOL

use Ratchet\ConnectionInterface;use Ratchet\Wamp\WampServerInterface;

class Demo implements WampServerInterface { public function onSubscribe(ConnectionInterface $conn, $topic) { } public function onUnSubscribe(ConnectionInterface $conn, $topic) { } public function onOpen(ConnectionInterface $conn) { } public function onClose(ConnectionInterface $conn) public function onCall(ConnectionInterface $conn, $id, $topic, array $params) { } public function onPublish(ConnectionInterface $conn, $topic, $event, array $exclude, array $eligible) { } public function onError(ConnectionInterface $conn, \Exception $e) { } public function onMessage($entry) { }}

Page 15: Creating Realtime Applications with PHP and Websockets

DEMO TIME: SITE VISITOR LOGGINGhttp://websockets.coreyballou.co/demos/UserLogger/

Page 16: Creating Realtime Applications with PHP and Websockets
Page 17: Creating Realtime Applications with PHP and Websockets
Page 18: Creating Realtime Applications with PHP and Websockets

DEMO TIME: MOUSE TRACKINGhttp://websockets.coreyballou.co/demos/Mouse/

Page 19: Creating Realtime Applications with PHP and Websockets
Page 20: Creating Realtime Applications with PHP and Websockets
Page 21: Creating Realtime Applications with PHP and Websockets

DEMO TIME: TODO LISThttp://websockets.coreyballou.co/demos/Todo/

Page 22: Creating Realtime Applications with PHP and Websockets
Page 23: Creating Realtime Applications with PHP and Websockets

WEBSOCKETS USE CASESAnalytics and dashboardsPlay-by-play sportsStock tradingNews tickersChatMultiplayer gamingSocial streamsUser collaborationInstant feedback autocompletionYOUR IMAGINATION

Page 24: Creating Realtime Applications with PHP and Websockets

WEBSOCKETS AND WAMPPROBABLY NOT THE WAMP YOU'RE THINKING OF

WAMP is a sub-protocol of WebSocketsWAMP is async RPCWAMP is async PubSub

Page 25: Creating Realtime Applications with PHP and Websockets

RPC PUBSUB

AUTOBAHN.JS: A JS CLIENT LIBRARYSUPPORTING WAMP

window.onload = function() { var ws = ab.connect( "ws://localhost:9000", connected, disconnected );

function connected(session) { var arg1 = 'hello', arg2 = 'world';

session.call('topic', arg1, arg2).then( callback_success_func, callback_error_func ); }

window.onload = function() { var ws = ab.connect( "ws://localhost:9000", connected, disconnected );

function connected(session) { session.subscribe('topic', callback_func); session.publish('myTopic', { id: 27, ts: new Date().getTime() }); }

function disconnect(code, reason) { console.log(reason);

Page 26: Creating Realtime Applications with PHP and Websockets

CLIENT SIDE WEBSOCKET FRAMEWORKSSo you can be under way with minimal overhead.

if you don't need fallbacks.

provides WAMP support.

crudely supported by

supports JS/Java/Groovy, sorry PHP :(

Native HTML5 SupportAutobahn.jsPortalSocket.IO Elephant.IO

Atmosphere.js

Page 27: Creating Realtime Applications with PHP and Websockets

OTHER SERVER SIDE FRAMEWORKS formerly php-websocket.

for Socket.IO support in PHP.

WrenchElephant.IO

Page 28: Creating Realtime Applications with PHP and Websockets

COOL DEMOSBecause copying is the sincerest form of flattery.

PlinkPaint With MePixelatrWordSquaredBrowserQuestRawketsWPilotRumpetrollJiTT Realtim TwitterwallQuake 2 Port

Page 29: Creating Realtime Applications with PHP and Websockets

CREDITS

RatchetAutobahn.jsWAMP.wsAn Introduction To WebSocketsWebSocket.org | About HTML5 WebSocketsWebSocket.org | HTML5 Web Sockets: A Quantum Leapin Scalability for the WebBloated Request & Response HeadersW3C | The Web Sockets API Publication HistoryWikipedia | WebSocketCanIUse?

IETF

Page 31: Creating Realtime Applications with PHP and Websockets

QUESTIONS? COMMENTS?https://joind.in/8020