SlideShare une entreprise Scribd logo
1  sur  31
Télécharger pour lire hors ligne
WebSockety
Ondřej Mirtes
Využitelné všude tam, kde teď
máte periodické AJAX požadavky$
chat, notifikace, hry, realtime
updates…
Počáteční HTTP handshake, poté
stálé spojení přes TCP.$
V komunikaci se posílají jen změny
(v AJAXu obvykle celý stav
aplikace).
caniuse.com
Detekce podpory
return	
  'WebSocket'	
  in	
  window;
Nekontrolujte typ a verzi prohlížeče,
ale vždy výskyt konkrétní funkcionality.
var	
  ws	
  =	
  new	
  WebSocket('ws://localhost:8080');	
  
$
ws.onopen	
  =	
  function()	
  {	
  
$
};	
  
$
ws.onmessage	
  =	
  function(event)	
  {	
  
	
  	
  console.log(event.data);	
  
};	
  
$
ws.onclose	
  =	
  function()	
  {	
  
$
};
Pozor - připojuje už konstruktor!
var	
  ws	
  =	
  new	
  WebSocketWrapper(	
  
	
   'ws://localhost:8080'	
  
);	
  
ws.connect();	
  
$
ws.on('postLiked',	
  function(data)	
  {	
  
	
   	
  
});	
  
$
ws.on('chatMessage',	
  function(data)	
  {	
  
$
});	
  
$
ws.send({'action':'ping'});
https://gist.github.com/10647722
Můj vlastní wrapper, který řeší reconnecting

a rozstřelování konkrétních akcí do jednotlivých
callbacků (oproti jedinému "onmessage").
Zakažte uživateli
provádět akce při
uzavřeném spojení
Hrozí ztráta dat.
Proč WebSockety v PHP a ne v něčem
vhodnějším, třeba node.js?$
$
Pokud máte už běžící aplikaci, tak
napsáním WS funkcionality v PHP budete
těžit z jednotné codebase, využití znalostí
týmu a stejných procesů na testování,
continuous integration, build a deployment.$
$
Pokud stavíte na zelené louce a chcete se
naučit něco nového, tak vás do PHP nutit
nebudu :)
$loop	
  =	
  ReactEventLoopFactory::create();	
  
$socket	
  =	
  new	
  ReactSocketServer($loop);	
  
$http	
  =	
  new	
  ReactHttpServer($socket,	
  $loop);	
  
$
$http-­‐>on('request',	
  function($request,	
  $response)	
  {	
  
	
   $response-­‐>writeHead(	
  
	
   	
   200,	
  
	
   	
   ['Content-­‐Type'	
  =>	
  'text/plain']	
  
	
   );	
  
	
   $response-­‐>end("Hello	
  Worldn");	
  
});	
  
$
$socket-­‐>listen(1337);	
  
$loop-­‐>run();
http://u.k47.cz/2Bw
while	
  (true)	
  {	
  
	
   ...	
  
}
Event loop
http://u.k47.cz/2Bw
Request 1
Response 1
Request 2
Response 2
Request 3
Response 3
Request 4
Response 4
React je asynchronní, ale ne paralelní
– běží stále v jednom vlákně.
while	
  (true)	
  {	
  
	
   ...	
  
}
Event loop
http://u.k47.cz/2Bw
Response 1
Response 2
Response 3
sleep(15);
Request 2 Request 3Request 1
http://socketo.me/
composer.json
{	
  
	
  	
  	
  	
  "require":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  "cboden/Ratchet":	
  "~0.3"	
  
	
  	
  	
  	
  },	
  
	
  	
  	
  	
  "suggest":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  "ext-­‐libevent":	
  ""	
  
	
  	
  	
  	
  }	
  
}
S libevent rozšířením se použije
efektivnější implementace event loop.
use	
  RatchetHttpHttpServer;	
  
use	
  RatchetServerIoServer;	
  
use	
  RatchetWebSocketWsServer;	
  
use	
  ReactEventLoopFactory;	
  
use	
  ReactSocketServer;	
  
$
$loop	
  =	
  Factory::create();	
  
$server	
  =	
  new	
  Server($loop);	
  
$server-­‐>listen(8080,	
  '0.0.0.0');	
  
$
new	
  IoServer(	
  
	
   new	
  HttpServer(new	
  WsServer($app)),	
  
	
   $server	
  
);	
  
$
$loop-­‐>run(); Spuštěný proces spravujte např. pomocí
supervisord.org, aby stále běžel.
use	
  RatchetConnectionInterface	
  as	
  Client;	
  
$
class	
  App	
  implements	
  RatchetMessageComponentInterface	
  
{	
  
$
	
   public	
  function	
  onOpen(Client	
  $client)	
  {	
  
$
	
   }	
  
$
	
   public	
  function	
  onMessage(Client	
  $client,	
  $message)	
  {	
  
$
	
   }	
  
$
	
   public	
  function	
  onClose(Client	
  $client)	
  {	
  
	
   	
  
	
   }	
  
$
	
   public	
  function	
  onError(Client	
  $client,	
  Exception	
  $e)	
  {	
  
$
	
   }	
  
$
}
public	
  function	
  onMessage(Client	
  $client,	
  $message)	
  
{	
  
	
  	
  	
  	
  foreach	
  ($this-­‐>clients	
  as	
  $c)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  if	
  ($c	
  !==	
  $client)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  $c-­‐>send($message);	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
}
Rozeslání zprávy

na ostatní klienty
Při navázání spojení
pošlete klientovi
počáteční stav
Např. posledních 10 zpráv v chatu. Pokud
byste počáteční stav nepotřebovali, tak vlastně
nepotřebujete ani žádné úložiště na data.
Časovače
$loop-­‐>addTimer(5,	
  function()	
  {	
  
	
  	
  	
  	
  //	
  za	
  pět	
  sekund	
  
});	
  
$
$loop-­‐>addPeriodicTimer(5,	
  function()	
  {	
  
	
  	
  	
  	
  //	
  každých	
  pět	
  sekund	
  
});
Na odpojení uživatele při neaktivitě, na zasílání
pingu pro udržení připojení. Časovače jsou jen
v paměti, po pádu a obnovení procesu

je musíte zrekonstruovat.
Flash polyfill
https://github.com/gimite/web-socket-js
use	
  RatchetServerFlashPolicy;	
  
use	
  RatchetServerIoServer;	
  
use	
  ReactSocketServer;	
  
$
$server	
  =	
  new	
  Server($loop);	
  
$server-­‐>listen(843,	
  '0.0.0.0');	
  
$policy	
  =	
  new	
  FlashPolicy();	
  
$policy-­‐>addAllowedAccess('*',	
  8080);	
  
$
new	
  IoServer($policy,	
  $server);	
  
$loop-­‐>run();
FlashPolicy
Long polling
AJAX fallback, který funguje všude$
POST požadavky pro odchozí zprávy$
Stream příchozích zpráv přes dlouhodobý
GET požadavek$
xhr.responseText &
xhr.onreadystatechange
Ratchet
Long polling
server
WS
WS
HTTP
https://gist.github.com/10895929
Long polling server = HTTP server

v PHP + WebSocket klient v PHP :)
Ratchet neumí SSL (wss://)$
Webserver může fungovat jako proxy,

která zabezpečenou komunikaci zajistí$
Webserver může WebSockety poskytnout

na klasických portech (80 a 443) –

např. na subdoméně$
Apache – mod_proxy_wstunnel
Ratchet
ws.foo.com wslp.foo.com www.foo.com
Long polling
Nginx jako proxy může všechny služby
poskytnout na klasických portech – 80, 443.
http://zeromq.org/
Webserver
CLI
Ratchet
WebSocket
klienti
Ratchet běží v odděleném procesu, pokud potřebujete
reagovat na akci z webové aplikace nebo třeba cronu,
pošlete ji do Ratchetu pomocí ZMQ.
ZeroMQ - receiver
use	
  ReactZMQContext;	
  
$
$context	
  =	
  new	
  Context($loop);	
  
$socket	
  =	
  $context-­‐>getSocket(ZMQ::SOCKET_PULL);	
  
$socket-­‐>bind('tcp://127.0.0.1:5555');	
  
$socket-­‐>on('message',	
  [$app,	
  'onZmqMessage']);
ZeroMQ - sender
$context	
  =	
  new	
  ZMQContext();	
  
$socket	
  =	
  $context-­‐>getSocket(	
  
	
   ZMQ::SOCKET_PUSH,	
  
	
   'id'	
  
);	
  
$socket-­‐>connect('tcp://127.0.0.1:5555');	
  
$socket-­‐>send('ahoj!');
@OndrejMirtes

Contenu connexe

Tendances

Jak si (ne)nechat hacknout Wordpress stránky - How to have unhackable WordPre...
Jak si (ne)nechat hacknout Wordpress stránky - How to have unhackable WordPre...Jak si (ne)nechat hacknout Wordpress stránky - How to have unhackable WordPre...
Jak si (ne)nechat hacknout Wordpress stránky - How to have unhackable WordPre...Michal Kubicek
 
Jak se dělal nový Skrz.cz na Symfony a Elasticsearch
Jak se dělal nový Skrz.cz na Symfony a ElasticsearchJak se dělal nový Skrz.cz na Symfony a Elasticsearch
Jak se dělal nový Skrz.cz na Symfony a ElasticsearchJakub Kulhan
 
ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...
ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...
ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...Jakub Kulhan
 
Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...
Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...
Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...Security Session
 
Zmrakování pružné včely
Zmrakování pružné včelyZmrakování pružné včely
Zmrakování pružné včelyfersman
 
WordCamp Praha 2017 - Martin Hlaváč
WordCamp Praha 2017 - Martin HlaváčWordCamp Praha 2017 - Martin Hlaváč
WordCamp Praha 2017 - Martin HlaváčBrilo Team
 

Tendances (8)

Jak si (ne)nechat hacknout Wordpress stránky - How to have unhackable WordPre...
Jak si (ne)nechat hacknout Wordpress stránky - How to have unhackable WordPre...Jak si (ne)nechat hacknout Wordpress stránky - How to have unhackable WordPre...
Jak si (ne)nechat hacknout Wordpress stránky - How to have unhackable WordPre...
 
Jak se dělal nový Skrz.cz na Symfony a Elasticsearch
Jak se dělal nový Skrz.cz na Symfony a ElasticsearchJak se dělal nový Skrz.cz na Symfony a Elasticsearch
Jak se dělal nový Skrz.cz na Symfony a Elasticsearch
 
ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...
ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...
ReactPHP + Symfony = profit aneb 1000req/s přes Symfony s minimálními nár...
 
Shibboleth v Praxi - DSpace (Vlastimil Krejčíř)
Shibboleth v Praxi - DSpace (Vlastimil Krejčíř)Shibboleth v Praxi - DSpace (Vlastimil Krejčíř)
Shibboleth v Praxi - DSpace (Vlastimil Krejčíř)
 
Kdyby/Translation
Kdyby/TranslationKdyby/Translation
Kdyby/Translation
 
Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...
Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...
Zabezpečení nejen SSH na serveru pomocí Fail2Ban a jednoduchého honeypotu. / ...
 
Zmrakování pružné včely
Zmrakování pružné včelyZmrakování pružné včely
Zmrakování pružné včely
 
WordCamp Praha 2017 - Martin Hlaváč
WordCamp Praha 2017 - Martin HlaváčWordCamp Praha 2017 - Martin Hlaváč
WordCamp Praha 2017 - Martin Hlaváč
 

En vedette

Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)Péhápkaři
 
06 prez10(tvorba webu)
06 prez10(tvorba webu)06 prez10(tvorba webu)
06 prez10(tvorba webu)olc_user
 
VIM - nejefektivnější editor na světě
VIM - nejefektivnější editor na světěVIM - nejefektivnější editor na světě
VIM - nejefektivnější editor na světěClevis s.r.o.
 
Nikola luxova
Nikola luxovaNikola luxova
Nikola luxovacekaon
 
Av technika 13
Av technika 13Av technika 13
Av technika 13olc_user
 
ORM Designer: Speed up your ORM development
ORM Designer: Speed up your ORM developmentORM Designer: Speed up your ORM development
ORM Designer: Speed up your ORM developmentBrnoPHP
 
Jaroslav zlamal
Jaroslav zlamalJaroslav zlamal
Jaroslav zlamalcekaon
 
Deployment PHP aplikací | WebExpo 2011
Deployment PHP aplikací | WebExpo 2011Deployment PHP aplikací | WebExpo 2011
Deployment PHP aplikací | WebExpo 2011Jan Mittner
 
Čtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php frameworkČtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php frameworkMartin Zeman
 
What makes a good developer from a management perspective
What makes a good developer from a management perspectiveWhat makes a good developer from a management perspective
What makes a good developer from a management perspectiveBrnoPHP
 
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Péhápkaři
 
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clustercommit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clusterJakub Kulhan
 
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě
 
Symfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconSymfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconVojta Svoboda
 
Real-time Web a NodeJS
Real-time Web a NodeJSReal-time Web a NodeJS
Real-time Web a NodeJSJakub Nesetril
 
Microservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowMicroservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowJakub Nesetril
 
FTP deployment Devel 2015
FTP deployment Devel 2015FTP deployment Devel 2015
FTP deployment Devel 2015David Grudl
 
Nette: jak rozbít atom?
Nette: jak rozbít atom?Nette: jak rozbít atom?
Nette: jak rozbít atom?David Grudl
 

En vedette (20)

Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
Tomáš Votruba - Jak přežít Symfony 3 (1. sraz přátel Symfony v Praze)
 
06 prez10(tvorba webu)
06 prez10(tvorba webu)06 prez10(tvorba webu)
06 prez10(tvorba webu)
 
VIM - nejefektivnější editor na světě
VIM - nejefektivnější editor na světěVIM - nejefektivnější editor na světě
VIM - nejefektivnější editor na světě
 
Nikola luxova
Nikola luxovaNikola luxova
Nikola luxova
 
Av technika 13
Av technika 13Av technika 13
Av technika 13
 
ORM Designer: Speed up your ORM development
ORM Designer: Speed up your ORM developmentORM Designer: Speed up your ORM development
ORM Designer: Speed up your ORM development
 
Jaroslav zlamal
Jaroslav zlamalJaroslav zlamal
Jaroslav zlamal
 
Deployment PHP aplikací | WebExpo 2011
Deployment PHP aplikací | WebExpo 2011Deployment PHP aplikací | WebExpo 2011
Deployment PHP aplikací | WebExpo 2011
 
Čtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php frameworkČtvrtkon #44 - Symfony php framework
Čtvrtkon #44 - Symfony php framework
 
What makes a good developer from a management perspective
What makes a good developer from a management perspectiveWhat makes a good developer from a management perspective
What makes a good developer from a management perspective
 
Neo4j Jízdomat
Neo4j JízdomatNeo4j Jízdomat
Neo4j Jízdomat
 
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
Martin Froněk - Jak využít soft skills ve svůj prospěch 2 (15. sraz přátel PH...
 
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS clustercommit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
commit => #GitHub => #CircleCI => #Docker => #Kubernetes #AWS cluster
 
Asynchronně v PHP
Asynchronně v PHPAsynchronně v PHP
Asynchronně v PHP
 
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v NetteVývojáři sobě: 0. sraz - PHP: Appka v Nette
Vývojáři sobě: 0. sraz - PHP: Appka v Nette
 
Symfony vs Nette vs Phalcon
Symfony vs Nette vs PhalconSymfony vs Nette vs Phalcon
Symfony vs Nette vs Phalcon
 
Real-time Web a NodeJS
Real-time Web a NodeJSReal-time Web a NodeJS
Real-time Web a NodeJS
 
Microservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflowMicroservice Stategies - Scaling your API design workflow
Microservice Stategies - Scaling your API design workflow
 
FTP deployment Devel 2015
FTP deployment Devel 2015FTP deployment Devel 2015
FTP deployment Devel 2015
 
Nette: jak rozbít atom?
Nette: jak rozbít atom?Nette: jak rozbít atom?
Nette: jak rozbít atom?
 

Similaire à WebSockets - how to do real-time applications in PHP

WP výkon a jeho profilování
WP výkon a jeho profilováníWP výkon a jeho profilování
WP výkon a jeho profilováníVladimír Smitka
 
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Develcz
 
Použití Next.js a Reactí UI khinihovny v aplikaci
Použití Next.js a Reactí UI khinihovny v aplikaciPoužití Next.js a Reactí UI khinihovny v aplikaci
Použití Next.js a Reactí UI khinihovny v aplikaciMartin Krištof
 
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)Martin Zeman
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)Péhápkaři
 
Petr Ferschmann: AWS Lambda aneb ať žije funkce jako služba
Petr Ferschmann:  AWS Lambda aneb ať žije funkce jako službaPetr Ferschmann:  AWS Lambda aneb ať žije funkce jako služba
Petr Ferschmann: AWS Lambda aneb ať žije funkce jako službaDevelcz
 
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)Jakub Kulhan
 
Komunikační protokoly pro IoT (LinuxDays 2014)
Komunikační protokoly pro IoT (LinuxDays 2014)Komunikační protokoly pro IoT (LinuxDays 2014)
Komunikační protokoly pro IoT (LinuxDays 2014)Adam Hořčica
 
React premature performance optimization
React premature performance optimizationReact premature performance optimization
React premature performance optimizationMartinKritof1
 
Malware Houdiny
Malware HoudinyMalware Houdiny
Malware HoudinyCESNET
 
Android Development for Phone and Tablet
Android Development for Phone and TabletAndroid Development for Phone and Tablet
Android Development for Phone and TabletTomáš Kypta
 
Javascript na steroidech
Javascript na steroidechJavascript na steroidech
Javascript na steroidechseznamVyvojari
 
JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017Michal Blažek
 
XSS PHP CSP ETC OMG WTF BBQ
XSS PHP CSP ETC OMG WTF BBQXSS PHP CSP ETC OMG WTF BBQ
XSS PHP CSP ETC OMG WTF BBQMichal Špaček
 

Similaire à WebSockets - how to do real-time applications in PHP (20)

WP výkon a jeho profilování
WP výkon a jeho profilováníWP výkon a jeho profilování
WP výkon a jeho profilování
 
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
 
Použití Next.js a Reactí UI khinihovny v aplikaci
Použití Next.js a Reactí UI khinihovny v aplikaciPoužití Next.js a Reactí UI khinihovny v aplikaci
Použití Next.js a Reactí UI khinihovny v aplikaci
 
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
 
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
MicroKernel aneb spatny nazev pro Helper (5. sraz pratel Symfony)
 
Deployment prakticky
Deployment praktickyDeployment prakticky
Deployment prakticky
 
Kdyby/Events
Kdyby/EventsKdyby/Events
Kdyby/Events
 
Petr Ferschmann: AWS Lambda aneb ať žije funkce jako služba
Petr Ferschmann:  AWS Lambda aneb ať žije funkce jako službaPetr Ferschmann:  AWS Lambda aneb ať žije funkce jako služba
Petr Ferschmann: AWS Lambda aneb ať žije funkce jako služba
 
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
#golang @SkrzCzDev (Skrz DEV Cirkus 21.10.2015)
 
Komunikační protokoly pro IoT (LinuxDays 2014)
Komunikační protokoly pro IoT (LinuxDays 2014)Komunikační protokoly pro IoT (LinuxDays 2014)
Komunikační protokoly pro IoT (LinuxDays 2014)
 
React premature performance optimization
React premature performance optimizationReact premature performance optimization
React premature performance optimization
 
TNPW2-2011-03
TNPW2-2011-03TNPW2-2011-03
TNPW2-2011-03
 
Malware Houdiny
Malware HoudinyMalware Houdiny
Malware Houdiny
 
Android Development for Phone and Tablet
Android Development for Phone and TabletAndroid Development for Phone and Tablet
Android Development for Phone and Tablet
 
TNPW2-2011-06
TNPW2-2011-06TNPW2-2011-06
TNPW2-2011-06
 
Nástěnka 02
Nástěnka 02Nástěnka 02
Nástěnka 02
 
Javascript na steroidech
Javascript na steroidechJavascript na steroidech
Javascript na steroidech
 
ASP.NET 3.5 / futures
ASP.NET 3.5 / futuresASP.NET 3.5 / futures
ASP.NET 3.5 / futures
 
JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017JavaScript v GTM - Measure Camp Brno 2017
JavaScript v GTM - Measure Camp Brno 2017
 
XSS PHP CSP ETC OMG WTF BBQ
XSS PHP CSP ETC OMG WTF BBQXSS PHP CSP ETC OMG WTF BBQ
XSS PHP CSP ETC OMG WTF BBQ
 

WebSockets - how to do real-time applications in PHP

  • 2. Využitelné všude tam, kde teď máte periodické AJAX požadavky$ chat, notifikace, hry, realtime updates…
  • 3. Počáteční HTTP handshake, poté stálé spojení přes TCP.$ V komunikaci se posílají jen změny (v AJAXu obvykle celý stav aplikace).
  • 5. Detekce podpory return  'WebSocket'  in  window; Nekontrolujte typ a verzi prohlížeče, ale vždy výskyt konkrétní funkcionality.
  • 6. var  ws  =  new  WebSocket('ws://localhost:8080');   $ ws.onopen  =  function()  {   $ };   $ ws.onmessage  =  function(event)  {      console.log(event.data);   };   $ ws.onclose  =  function()  {   $ }; Pozor - připojuje už konstruktor!
  • 7. var  ws  =  new  WebSocketWrapper(     'ws://localhost:8080'   );   ws.connect();   $ ws.on('postLiked',  function(data)  {       });   $ ws.on('chatMessage',  function(data)  {   $ });   $ ws.send({'action':'ping'}); https://gist.github.com/10647722 Můj vlastní wrapper, který řeší reconnecting
 a rozstřelování konkrétních akcí do jednotlivých callbacků (oproti jedinému "onmessage").
  • 8. Zakažte uživateli provádět akce při uzavřeném spojení Hrozí ztráta dat.
  • 9. Proč WebSockety v PHP a ne v něčem vhodnějším, třeba node.js?$ $ Pokud máte už běžící aplikaci, tak napsáním WS funkcionality v PHP budete těžit z jednotné codebase, využití znalostí týmu a stejných procesů na testování, continuous integration, build a deployment.$ $ Pokud stavíte na zelené louce a chcete se naučit něco nového, tak vás do PHP nutit nebudu :)
  • 10.
  • 11. $loop  =  ReactEventLoopFactory::create();   $socket  =  new  ReactSocketServer($loop);   $http  =  new  ReactHttpServer($socket,  $loop);   $ $http-­‐>on('request',  function($request,  $response)  {     $response-­‐>writeHead(       200,       ['Content-­‐Type'  =>  'text/plain']     );     $response-­‐>end("Hello  Worldn");   });   $ $socket-­‐>listen(1337);   $loop-­‐>run(); http://u.k47.cz/2Bw
  • 12. while  (true)  {     ...   } Event loop http://u.k47.cz/2Bw Request 1 Response 1 Request 2 Response 2 Request 3 Response 3 Request 4 Response 4 React je asynchronní, ale ne paralelní – běží stále v jednom vlákně.
  • 13. while  (true)  {     ...   } Event loop http://u.k47.cz/2Bw Response 1 Response 2 Response 3 sleep(15); Request 2 Request 3Request 1
  • 15. composer.json {          "require":  {                  "cboden/Ratchet":  "~0.3"          },          "suggest":  {                  "ext-­‐libevent":  ""          }   } S libevent rozšířením se použije efektivnější implementace event loop.
  • 16. use  RatchetHttpHttpServer;   use  RatchetServerIoServer;   use  RatchetWebSocketWsServer;   use  ReactEventLoopFactory;   use  ReactSocketServer;   $ $loop  =  Factory::create();   $server  =  new  Server($loop);   $server-­‐>listen(8080,  '0.0.0.0');   $ new  IoServer(     new  HttpServer(new  WsServer($app)),     $server   );   $ $loop-­‐>run(); Spuštěný proces spravujte např. pomocí supervisord.org, aby stále běžel.
  • 17. use  RatchetConnectionInterface  as  Client;   $ class  App  implements  RatchetMessageComponentInterface   {   $   public  function  onOpen(Client  $client)  {   $   }   $   public  function  onMessage(Client  $client,  $message)  {   $   }   $   public  function  onClose(Client  $client)  {         }   $   public  function  onError(Client  $client,  Exception  $e)  {   $   }   $ }
  • 18. public  function  onMessage(Client  $client,  $message)   {          foreach  ($this-­‐>clients  as  $c)  {                  if  ($c  !==  $client)  {                          $c-­‐>send($message);                  }          }   } Rozeslání zprávy
 na ostatní klienty
  • 19. Při navázání spojení pošlete klientovi počáteční stav Např. posledních 10 zpráv v chatu. Pokud byste počáteční stav nepotřebovali, tak vlastně nepotřebujete ani žádné úložiště na data.
  • 20. Časovače $loop-­‐>addTimer(5,  function()  {          //  za  pět  sekund   });   $ $loop-­‐>addPeriodicTimer(5,  function()  {          //  každých  pět  sekund   }); Na odpojení uživatele při neaktivitě, na zasílání pingu pro udržení připojení. Časovače jsou jen v paměti, po pádu a obnovení procesu
 je musíte zrekonstruovat.
  • 22. use  RatchetServerFlashPolicy;   use  RatchetServerIoServer;   use  ReactSocketServer;   $ $server  =  new  Server($loop);   $server-­‐>listen(843,  '0.0.0.0');   $policy  =  new  FlashPolicy();   $policy-­‐>addAllowedAccess('*',  8080);   $ new  IoServer($policy,  $server);   $loop-­‐>run(); FlashPolicy
  • 23. Long polling AJAX fallback, který funguje všude$ POST požadavky pro odchozí zprávy$ Stream příchozích zpráv přes dlouhodobý GET požadavek$ xhr.responseText & xhr.onreadystatechange
  • 24. Ratchet Long polling server WS WS HTTP https://gist.github.com/10895929 Long polling server = HTTP server
 v PHP + WebSocket klient v PHP :)
  • 25. Ratchet neumí SSL (wss://)$ Webserver může fungovat jako proxy,
 která zabezpečenou komunikaci zajistí$ Webserver může WebSockety poskytnout
 na klasických portech (80 a 443) –
 např. na subdoméně$ Apache – mod_proxy_wstunnel
  • 26. Ratchet ws.foo.com wslp.foo.com www.foo.com Long polling Nginx jako proxy může všechny služby poskytnout na klasických portech – 80, 443.
  • 28. Webserver CLI Ratchet WebSocket klienti Ratchet běží v odděleném procesu, pokud potřebujete reagovat na akci z webové aplikace nebo třeba cronu, pošlete ji do Ratchetu pomocí ZMQ.
  • 29. ZeroMQ - receiver use  ReactZMQContext;   $ $context  =  new  Context($loop);   $socket  =  $context-­‐>getSocket(ZMQ::SOCKET_PULL);   $socket-­‐>bind('tcp://127.0.0.1:5555');   $socket-­‐>on('message',  [$app,  'onZmqMessage']);
  • 30. ZeroMQ - sender $context  =  new  ZMQContext();   $socket  =  $context-­‐>getSocket(     ZMQ::SOCKET_PUSH,     'id'   );   $socket-­‐>connect('tcp://127.0.0.1:5555');   $socket-­‐>send('ahoj!');