SlideShare uma empresa Scribd logo
HTTP://LOCALHOST
PALESTRA INTERATIVA!
SMARTPHONE / TABLET / NOTEBOOK
AUMENTE O VOLUME!
ASYNC E WEBSOCKETS COM PHP
MUITO PRAZER, PODE ME CHAMAR DE BOB!
Evangelista PHP - VIVA PHP SP CAMPINAS! VIVA PHP!
Já fiz mais de 100 sites! o/
Trabalho na Memed, fazendo uma plataforma de prescrição
médica
Sou fução desde quando nasci...
GOSTO DO PHP PORQUE
NÓS SOMOS PIRATAS!
Num belo dia, precisei fazer algo assim:
React e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel Couto
Buscando usuários:
React e Ratchet, async e websockets com PHP, por Gabriel Couto
//Vou querer X usuários que encaixam nessa busca,
//batata grande e uma coca-cola
$usuarios = Usuarios::where('nome', $q)->get();
//Processa a resposta
$usuarios = $this->processarResposta($usuarios);
//Vai que é tua View!
return view('resultado', ['usuarios' => $usuarios]);
Você faz isso?
Sim (0)
Não (0)
$usuarios = Usuarios::where('nome', $q)->get();
//Só será executado daqui para frente após
//a resposta do banco de dados (IO) chegar
$usuarios = $this->processarResposta($usuarios);
//Aqui após um processo intensivo de CPU
return view('resultado', ['usuarios' => $usuarios]);
BLOCKING IO
PRECISO SER MAIS RÁPIDO!
Vou processar metade dos usuários em paralelo com a outra metade
NODE.JS
Usuarios.find({
where: {nome: q},
limit: 5000
}).then(function(usuarios) {
//Só executa aqui quando chegar o resultado
processarResultado(usuarios);
});
Usuarios.find({
where: {nome: q},
offset: 5000,
limit: 5000
}).then(function(usuarios) {
//Só executa aqui quando chegar o resultado
processarResultado(usuarios);
});
E NO PHP?
Você sabe como resolver isso?
Sim (0)
Não (0)
THREADING
FORK
React e Ratchet, async e websockets com PHP, por Gabriel Couto
O que um fork faz?
Cria novo processo, do zero! (0)
Cria um clone e copia a memória (0)
Cria um clone e usa a mesma memória (0)
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork =(');
} else if ($pid) {
// I'm your father!
DB::reconnect('mysql');
$users = $this->getUsers($totalUsers / 2, 0);
//Aguarda o processo filho terminar
pcntl_wait($status);
//Faz um merge do que o processo pai e filho processaram
//Os dados do processo filho estão no cache
$users = array_merge($users, Cache::pull($cacheKey));
}
} else {
// we are the child
DB::reconnect('mysql');
$users = $this->getUsers($totalUsers / 2, $totalUsers / 2);
//Armazena os usuários processados no cache
Cache::forever($cacheKey, $users);
die();
}
BUSCANDO 10.000 USUÁRIOS (COM ORM)
FORMA TRADICIONAL: 3063,82MS
FORK: 2029,68MS
O FORK TEM UM PROBLEMA:
NÃO FUNCIONA QUANDO O PHP É EXECUTADO
ATRAVÉS DO APACHE E DO NGINX
NON BLOCKING IO
React e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel Couto
//cria o main loop
$loop = ReactEventLoopFactory::create();
//cria a conexão com o MySQL
$connection = new ReactMySQLConnection($loop, array(
'dbname' => $_ENV['DB_DATABASE'],
'user' => $_ENV['DB_USERNAME'],
'passwd' => $_ENV['DB_PASSWORD'],
));
$connection->connect(function () {});
$connection->query($query, function ($command, $conn) use ($loop) {
if ($command->hasError()) {
$error = $command->getError();
} else {
$results = $command->resultRows;
$this->users = array_merge($this->users, $this->processUsers($results));
$this->queries--;
if ($this->queries == 0) {
$loop->stop();
}
}
});
Quem ganhou?
Forma tradicional (0)
React (0)
BUSCANDO 10.000 USUÁRIOS (SEM ORM)
FORMA TRADICIONAL: 659,02MS
REACT MYSQL: 1123,89MS
POR QUE COM REACT NÃO FOI MELHOR?
IO ­ CPU ­ CPU
REACT/MYSQL V0.2.0
CALMA, O REACT NOS DEU SUPER PODERES!
React e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel Couto
EXEMPLO DE SERVIDOR
$loop = ReactEventLoopFactory::create();
$socket = new ReactSocketServer($loop);
$socket->on('connection', function ($conn) use ($totalUsers) {
echo 'Enviando mensagem...' . PHP_EOL;
$users = $this->getUsers($totalUsers / 2, $totalUsers / 2);
$conn->end(serialize($users));
echo 'Enviada' . PHP_EOL;
});
$socket->listen(1337);
$loop->run();
EXEMPLO DE CLIENTE
$loop = ReactEventLoopFactory::create();
$dnsResolverFactory = new ReactDnsResolverFactory();
$dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
$connector = new ReactSocketClientConnector($loop, $dns);
$connector->create('127.0.0.1', 1337)->then(function (ReactStreamStream $stream) use
$stream->on('data', function ($data, $stream) use (&$buffer) {
$buffer .= $data;
});
});
$loop->run();
Quem ganhou?
Forma tradicional (0)
React (0)
BUSCANDO 10.000 USUÁRIOS (COM ORM)
FORMA TRADICIONAL: 3063,82MS
FORK: 2029,68MS
REACT SOCKET: 1910MS
EU QUERO MAIS!
React e Ratchet, async e websockets com PHP, por Gabriel Couto
RFC 6455 ­ DEZEMBRO DE 2011
Em 12 de Setembro de 2011 o Google Chrome 15 já implementava
The WebSocket Protocol enables two-way communication between a
client running untrusted code in a controlled environment to a remote
host that has opted-in to communications from that code.
Já usou Websockets?
Sim (0)
Não (0)
React e Ratchet, async e websockets com PHP, por Gabriel Couto
VANTAGEM DE USAR WEBSOCKETS:
O servidor websocket pode ficar na mesma porta que o HTTP padrão, ele
usa campos do cabeçalho HTTP distintos
Suporta um servidor rodando múltiplos domínios
Suporta proxies HTTP
Só envia cabeçalhos HTTP no ato da conexão, depois é dado puro (em
UTF-8 ou binário)
SOCKET.IO
BIBLIOTECA PARA NODEJS DE SERVIDOR DE
WEBSOCKETS
Funciona bem, mas não é mais Websocket puro, vai muito além!
SERVIDOR
$controller = new Controller();
$server = IoServer::factory(
new HttpServer(
new WsServer(
$controller
)
),
777
);
$loop = $server->loop;
$loop->addPeriodicTimer(5, function () use ($controller) {
$controller->sendCounterMessage();
});
$server->run();
use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
class App implements MessageComponentInterface
{
public static $connections;
public static $lastMessage;
public function __construct()
{
self::$connections = new SplObjectStorage;
}
public function onOpen(ConnectionInterface $connection)
{
self::$connections->attach($connection);
if (isset(App::$lastMessage)) {
Sender::send(App::$lastMessage, $connection);
}
Log::d('Espectador conectado: ' . $connection->resourceId);
}
public function onMessage(ConnectionInterface $connection, $message)
{
App::$lastMessage = $message;
foreach (self::$connections as $anotherConnection) {
if ($anotherConnection !== $connection) {
Sender::send($message, $anotherConnection);
}
}
Log::d($message);
}
PADRONIZE SEUS OBJETOS
class HornMessage extends Message
{
protected $type = 'horn';
//getters and setters
}
class SlideMessage extends Message
{
protected $type = 'slide';
protected $indexh;
protected $indexv;
protected $indexf;
//getters and setters
}
ESCALABILIDADE
SEU SERVIDOR WEBSOCKET SOMENTE CUIDA DOS
WEBSOCKETS
React e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel Couto
TCHAU PESSOAL, ATÉ A PRÓXIMA!
Avalie minha palestra! CLIQUE AQUI
@gabrielrcouto
PHPSP
PHPSP CAMPINAS
Essa palestra está no GitHub
0 / 0
Buzinar

Mais conteúdo relacionado

PDF
Hello SAFE World!!!
PDF
JS Experience 2017 - Javascript Funcional
PDF
Introdução a worker
PDF
Let's log!
PDF
PHP Aula07 - conexão Com Banco de Dados
PDF
Php curl - Coleta de dados na web
ODP
Oficina postgresql basico_consegi2010
PDF
PHP e Mysql - DELETE
Hello SAFE World!!!
JS Experience 2017 - Javascript Funcional
Introdução a worker
Let's log!
PHP Aula07 - conexão Com Banco de Dados
Php curl - Coleta de dados na web
Oficina postgresql basico_consegi2010
PHP e Mysql - DELETE

Mais procurados (19)

ODP
A Biblioteca cURL
PDF
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividade
PDF
Mini Curso PHP Twig - PHP Conference 2017
PDF
Oficina jQuery
PDF
Pdo do PHP Palestra
PDF
Rest Beer v2
PDF
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PDF
Backbone.js - A espinha dorsal de aplicações web
PDF
JasperReports
PDF
Palestra de PDO
PDF
JavaScript Hacks
PDF
Desenvolvimento ágil com Kohana framework
KEY
Javascript + jQuery
PPTX
Otimização e Escalabilidade
PDF
Mashups: Criando Valor na Web 2.0
PDF
Mashups: Criando Valor na Web 2.0 (BandTec)
PDF
Realtime com node.js e socket.io
PDF
Backbone.js + Rails - Front-end e back-end conectados
PDF
Introdução ao framework CakePHP
A Biblioteca cURL
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividade
Mini Curso PHP Twig - PHP Conference 2017
Oficina jQuery
Pdo do PHP Palestra
Rest Beer v2
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
Backbone.js - A espinha dorsal de aplicações web
JasperReports
Palestra de PDO
JavaScript Hacks
Desenvolvimento ágil com Kohana framework
Javascript + jQuery
Otimização e Escalabilidade
Mashups: Criando Valor na Web 2.0
Mashups: Criando Valor na Web 2.0 (BandTec)
Realtime com node.js e socket.io
Backbone.js + Rails - Front-end e back-end conectados
Introdução ao framework CakePHP
Anúncio

Destaque (11)

PPTX
InterCon 2016 - Desenvolvimento para interfaces em vídeo e cases da plataform...
PDF
InterCon 2016 - HTTP/2 for Web Application Developers
PPTX
Testes O que são e para que servem? - LadyTalks
PDF
Real-Time Web Apps & Symfony. What are your options?
PDF
PHPExperience 2016 - Pirâmide de Testes
PPTX
Sistemas Distribuídos e PHP - Darkmira Tour BR 2016
PDF
InterCon 2016 - Internet of “Thinking” – IoT sem BS com ESP8266
ODP
WebSockets with PHP: Mission impossible
PDF
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
PDF
InterCon 2016 - Backend do IoT com RethinkDB e Python
PDF
Integrating React.js Into a PHP Application
InterCon 2016 - Desenvolvimento para interfaces em vídeo e cases da plataform...
InterCon 2016 - HTTP/2 for Web Application Developers
Testes O que são e para que servem? - LadyTalks
Real-Time Web Apps & Symfony. What are your options?
PHPExperience 2016 - Pirâmide de Testes
Sistemas Distribuídos e PHP - Darkmira Tour BR 2016
InterCon 2016 - Internet of “Thinking” – IoT sem BS com ESP8266
WebSockets with PHP: Mission impossible
InterCon 2016 - Gerenciando deploy e atualização de 450 apps sem enlouquecer
InterCon 2016 - Backend do IoT com RethinkDB e Python
Integrating React.js Into a PHP Application
Anúncio

Semelhante a React e Ratchet, async e websockets com PHP, por Gabriel Couto (20)

PPT
Curso de Introdução - PHP
PPTX
PDF
Ecommerce, mais simples do que parece
PDF
Ecommerce, mais simples do que parece
ODP
Da argila ao forte: como desenvolver uma loja com PagSeguro
PDF
ReactPHP && programacao assincrona em PHP
PPT
Html5 storage api
PDF
Memcached, Gearman e Sphinx
ODP
Php 07 Cakephp
PDF
Programando Melhor - Flisol
PDF
Código legado - PHP Conference Brasil - 2014
PDF
Criando e consumindo Web Services (REST) com o CakePHP
PDF
Aula 08 - Introdução ao banco de dados MySQL - Programação Web
PDF
Evento Front End SP - Organizando o Javascript
PDF
Programação funcional em JavaScript: como e por quê?
PPSX
5 Maneiras de melhorar seu código PHP
PPTX
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
PPT
PHP GERAL
ODP
Php 05 Mvc
PPTX
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Curso de Introdução - PHP
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que parece
Da argila ao forte: como desenvolver uma loja com PagSeguro
ReactPHP && programacao assincrona em PHP
Html5 storage api
Memcached, Gearman e Sphinx
Php 07 Cakephp
Programando Melhor - Flisol
Código legado - PHP Conference Brasil - 2014
Criando e consumindo Web Services (REST) com o CakePHP
Aula 08 - Introdução ao banco de dados MySQL - Programação Web
Evento Front End SP - Organizando o Javascript
Programação funcional em JavaScript: como e por quê?
5 Maneiras de melhorar seu código PHP
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
PHP GERAL
Php 05 Mvc
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1

Mais de iMasters (20)

PPTX
O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
PDF
Postgres: wanted, beloved or dreaded? - Fabio Telles
PPTX
Por que minha query esta lenta? - Suellen Moraes
PPTX
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
PDF
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
PPTX
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
PDF
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
PDF
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
PDF
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
PDF
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
PDF
Entendendo os porquês do seu servidor - Talita Bernardes
PDF
Backend performático além do "coloca mais máquina lá" - Diana Arnos
PPTX
Dicas para uma maior performance em APIs REST - Renato Groffe
PPTX
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
PDF
Quem se importa com acessibilidade Web? - Mauricio Maujor
PDF
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
PDF
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
PDF
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
PDF
Construindo aplicações mais confiantes - Carolina Karklis
PDF
Monitoramento de Aplicações - Felipe Regalgo
O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
Postgres: wanted, beloved or dreaded? - Fabio Telles
Por que minha query esta lenta? - Suellen Moraes
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Entendendo os porquês do seu servidor - Talita Bernardes
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Dicas para uma maior performance em APIs REST - Renato Groffe
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
Quem se importa com acessibilidade Web? - Mauricio Maujor
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Construindo aplicações mais confiantes - Carolina Karklis
Monitoramento de Aplicações - Felipe Regalgo

Último (10)

PDF
Metodologias ágeis - Slides - aulas 1 a 5.pdf
PDF
A sua pontuação aumenta ao escolher uma categoria, preencher uma descrição lo...
PDF
Agosto-Lilas-Conscientizacao-e-Combate-a-Violencia-contra-a-Mulher.pdf
PDF
Apostila_de_Laboratorio_de_Quimica_Inorg.pdf
PPTX
Classifirrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrcação_IPAQ.pptx
PDF
PROJETO DE PESQUISA PRONTO ESTÉTICA 2025 ABNT.pdf
PPTX
Fundamentos do Desenvolvimento Web. Fundamentos do Desenvolvimento Web.Fundam...
PPTX
TURMA modelo de modelo apresentação 4DE.pptx
PDF
PROJETO DE PESQUISA PRONTO FONOAUDIOLOGIA 2025 ABNT.pdf
PDF
Certificado de Conclusão Jornada Inteligência Artificial
Metodologias ágeis - Slides - aulas 1 a 5.pdf
A sua pontuação aumenta ao escolher uma categoria, preencher uma descrição lo...
Agosto-Lilas-Conscientizacao-e-Combate-a-Violencia-contra-a-Mulher.pdf
Apostila_de_Laboratorio_de_Quimica_Inorg.pdf
Classifirrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrcação_IPAQ.pptx
PROJETO DE PESQUISA PRONTO ESTÉTICA 2025 ABNT.pdf
Fundamentos do Desenvolvimento Web. Fundamentos do Desenvolvimento Web.Fundam...
TURMA modelo de modelo apresentação 4DE.pptx
PROJETO DE PESQUISA PRONTO FONOAUDIOLOGIA 2025 ABNT.pdf
Certificado de Conclusão Jornada Inteligência Artificial

React e Ratchet, async e websockets com PHP, por Gabriel Couto