SlideShare uma empresa Scribd logo
Gustavo Almeida
ReactPHP
$whois
CPU é rápida
I/O é lento
PHP ainda é essencialmente bloqueante.
I/O = Input/Output = E/S = entrada/saída de dados
Temos I/O em quase tudo : PDO, fopen, curl, BD
Relacionais, redes, email, APIs externas.
O processador que é o super-herói, fica ocioso.
CPU I/O
SÍNCRONO
ASSÍNCRONO
EXEMPLO - PIZZA
DELIVERY
request
request
response
BLOQUEANTE
Async em PHP
● pthreads
● popen()
● proc_open()
● pcntl_fork()
● socket_select()
● stream_select()
● stream_set_blocking()
● curl_multi_select()
Design Pattern React
programação reativa
reage a eventos
dispara callbacks
baseado no event loop
$loop->on(‘evento’,function(){
echo ‘reação feita’;
});
EVENT LOOP
requests
S.O.
filesystem
DB
email
EVENT LOOP
EVENT LOOP
requests
S.O.
filesystem
DB
email
while(true){
...
}
callbacks
Arquitetura - pedido / resposta
servidor
cliente / browser
cliente / browser
Arquitetura - pedido / resposta
servidor
cliente / browser
cliente / browser
Arquitetura - pedido / resposta
servidor
cliente / browser
cliente / browser
Tunel de mensagens (dados)
servidorcliente
event
loop
piscina
(poll)
tunel (stream/socket)
cliente
Tunel de mensagens (dados)
servidorcliente
event
loop
piscina
(poll)
tunel (stream/socket)
cliente
ReactPHP - “Hello World”
$loop = ReactEventLoopFactory::create();
$socket = new ReactSocketServer($loop);
$http = new ReactHttpServer($socket,$loop);
$http->on(‘request’,function($req,$res){
$res->writeHead(200);
$res->end(‘hello world’);
});
$socket->listen(1234);
$loop->run();
composer require react/react
NodeJS x ReactPHP
https://philsturgeon.uk/php/2013/11/12/benchmarking-codswallop-nodejs-v-php/
http://www.hostingadvice.com/blog/comparing-node-js-vs-php-performance/
https://www.sitepoint.com/sitepoint-smackdown-php-vs-node-js/
$loop = ReactEventLoopFactory::create();
$socket = ReactSocketServer($loop);
$clients = [];
$i=0;
$socket->on('connection', function($connection) use ($clients, &$i){
$connection->id = ++$i;
$connection->write("Digite seu Nome : ");
$connection->on('data', function($msg) use ($clients, $connection){
if(empty($connection->apelido)){
$connection->apelido=$msg;
}else{
foreach($clients as $client){
if($client->id == $connection->id)
continue; }
$client->write(sprintf("[%s]: %s",$connection->apelido,$connection->msg));
}
}
});
$clients[]=$connection;
});
$socket->listen(1234);
$loop->run();
Chat 100% PHP em 22 linhas
Timers && Ticks
Timers
javascript
setInterval()
clearInterval()
setTimeout()
clearTimeout()
sleep() somente congela
o processamento.
Timers
javascript
setInterval()
clearInterval()
setTimeout()
clearTimeout()
ReactPHP
addPeriodicTimer()
cancelTimer()
addTimer()
isTimerActive()
sleep() somente congela
o processamento.
EVENT LOOP
$loop->addPeriodicTimer(10, function(){
getTweets();
});
Promises
Promessa é uma abstração para programação assíncrona, que recebe algum
input (dados) e retorna uma promessa do output (resultado).
Um sistema baseado em callbacks, recebe um input e um callback (função), que
é executado passando algum output.
Promises
if(play($resultado)){
...
function play($param){
return conta($param);
}
function conta($param){
return alguma_conta($param);
}
Callback
$um->play(function ($dois)){
$dois->play(function ($tres)){
$tres->play(function ($quatro)){
$quatro->get(function($resultado)){
echo $resultado;
});
});
});
});
Callback Hell
$um->play(function ($dois)){
$dois->play(function ($tres)){
$tres->play(function ($quatro)){
$quatro->get(function($resultado)){
echo $resultado;
});
});
});
});
Deferred && Promises
$promise->then();
$promise->done();
$promise->otherwise();
$promise->always();
$deferred->resolve();
$deferred->reject();
● unfulfilled (waiting)
● fulfilled (resolved)
● rejected (failed)
$deferred = new ReactPromiseDeferred();
$promise = $deferred->promise();
$deferred
trabalho não finalizado
$promise
resultado não conhecido
tem
$deferred
trabalho não finalizado
$promise
resultado não conhecido
$callbacks
executados
estados
tem
tem
tem
$deferred
trabalho não finalizado
$promise
resultado não conhecido
$callbacks
executados
estados
tem
tem
tem
de acordo com ● unfulfilled (waiting)
● fulfilled (resolved)
● rejected (failed)
Encadeamento de Promises
$deferred->promise()->then(f(){})->then(f(){})->then(f(){}) ...
Encadeamento de Promises
$deferred->promise()->then(f(){})->then(f(){})->then(f(){}) ...
Encadeamento de Promises
$promises = [ ];
foreach($hostnames as $hostname){
$promises[ ]=$dns->resolve($hostname)->then(
function(){
…})-> ...
}
ReactPromiseall($promises)->then( function(){ …})-> ...
Streams && Sockets
stream
UDP, video, telefonia
socket
three-way-handshake
Streams && Sockets
Programa A Programa Bfluxo de dados
- Endereco
- Porta
● Readable
● Writeable
● Duplex
$loop = ReactEventLoopFactory::create();
$client = new ReactHttpClientClient($loop);
$file = new ReactStreamWritableResourceStream(fopen('sample.mp4', 'w'), $loop);
$request = $client->request('GET', 'http://www.sample-videos.com/videos/filme.mp4');
$request->on('response', function (ReactHttpClientResponse $response) use ($file) {
$size = $response->getHeaders()['Content-Length'];
$currentSize = 0;
$progress = new ReactStreamThroughStream();
$progress->on('data', function($data) use ($size, &$currentSize){
$currentSize += strlen($data);
echo "033[1A", "Downloading: ", number_format($currentSize / $size * 100), "%n";
});
$response->pipe($progress)->pipe($file);
});
$request->end();
$loop->run();
Informação em tempo real - Exibindo o progresso em % do download de um arquivo
var conn = new WebSocket('ws://127.0.0.1:1337');
conn.onmessage = function(e) { console.log(e.data); };
conn.onopen = function(e) { conn.send(Olá Mundo!'); };
$loop = ReactEventLoopFactory::create();
$socket = new ReactSocketServer('127.0.0.1:1337', $loop);
$socket->on('connection', function (ConnectionInterface $conn) {
Concatenando com pipe()
$loop = ReactEventLoopFactory::create();
$origem = new ReactStreamStream(fopen('log.txt', 'r+'), $loop);
$destino = new ReactStreamStream(fopen('destino.txt', 'w+'), $loop);
$origem->pipe($maiusculas)->pipe($blackList)-> ... ->pipe($destino);
$loop->run();
conceito parecido no linux ( | )
# ls | sort -r | tee arquivo.txt | wc -l
f() f()
???
PHP8
github: lga37
slideshare: lga33
br.linkedin.com/in/lga37
$loop->stop();

Mais conteúdo relacionado

Mais procurados

Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
Guilherme Blanco
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
tdc-globalcode
 
PHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsPHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object Calisthenics
Guilherme Blanco
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e Sphinx
Elton Minetto
 
Palestra de PDO
Palestra de PDOPalestra de PDO
Palestra de PDO
Almir Mendes
 
JasperReports
JasperReportsJasperReports
JasperReports
Vitor Mattos
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
Guilherme Blanco
 
Shell script
Shell scriptShell script
Shell script
Denis Costa
 
Why functional programming matters
Why functional programming mattersWhy functional programming matters
Why functional programming matters
Jean Carlo Machado
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota
Phil Calçado
 
Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3
garux
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
garux
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
Marcelo Rodrigo
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - Flisol
Leonn Leite
 
O que há de novo no PHP 5.3
O que há de novo no PHP 5.3O que há de novo no PHP 5.3
O que há de novo no PHP 5.3
Jose Berardo
 
TDD - Test Driven Development (em PHP)
TDD - Test Driven Development (em PHP)TDD - Test Driven Development (em PHP)
TDD - Test Driven Development (em PHP)
Augusto Pascutti
 
Php curl - Coleta de dados na web
Php curl - Coleta de dados na webPhp curl - Coleta de dados na web
Php curl - Coleta de dados na web
Luis Gustavo Almeida
 
Zabbix monitorando o zimbra collaboration 8.8 (1)
Zabbix   monitorando o zimbra collaboration 8.8 (1)Zabbix   monitorando o zimbra collaboration 8.8 (1)
Zabbix monitorando o zimbra collaboration 8.8 (1)
PAULO R. DEOLINDO JUNIOR
 

Mais procurados (18)

Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
PHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object CalisthenicsPHP para Adultos: Clean Code e Object Calisthenics
PHP para Adultos: Clean Code e Object Calisthenics
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e Sphinx
 
Palestra de PDO
Palestra de PDOPalestra de PDO
Palestra de PDO
 
JasperReports
JasperReportsJasperReports
JasperReports
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Shell script
Shell scriptShell script
Shell script
 
Why functional programming matters
Why functional programming mattersWhy functional programming matters
Why functional programming matters
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota
 
Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - Flisol
 
O que há de novo no PHP 5.3
O que há de novo no PHP 5.3O que há de novo no PHP 5.3
O que há de novo no PHP 5.3
 
TDD - Test Driven Development (em PHP)
TDD - Test Driven Development (em PHP)TDD - Test Driven Development (em PHP)
TDD - Test Driven Development (em PHP)
 
Php curl - Coleta de dados na web
Php curl - Coleta de dados na webPhp curl - Coleta de dados na web
Php curl - Coleta de dados na web
 
Zabbix monitorando o zimbra collaboration 8.8 (1)
Zabbix   monitorando o zimbra collaboration 8.8 (1)Zabbix   monitorando o zimbra collaboration 8.8 (1)
Zabbix monitorando o zimbra collaboration 8.8 (1)
 

Semelhante a ReactPHP && programacao assincrona em PHP

Curso de Introdução - PHP
Curso de Introdução - PHPCurso de Introdução - PHP
Curso de Introdução - PHP
Evandro Klimpel Balmant
 
Php
PhpPhp
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
Elton Minetto
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)
Pablo Dall'Oglio
 
Al sweigart, cap 3
Al sweigart, cap 3Al sweigart, cap 3
React e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel CoutoReact e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel Couto
iMasters
 
A Revolução dos Middlewares
A Revolução dos MiddlewaresA Revolução dos Middlewares
A Revolução dos Middlewares
Paulo Eduardo Rezende
 
LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - Funções
Carlos Santos
 
Doctrine for Dummies
Doctrine for DummiesDoctrine for Dummies
Doctrine for Dummies
Ari Stopassola Junior
 
A busca pelo deploy continuo
A busca pelo deploy continuoA busca pelo deploy continuo
A busca pelo deploy continuo
Lindolfo Rodrigues
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
Michael Castillo Granados
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
Impacta Eventos
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
Denis Costa
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
Vinícius Campitelli
 
PHP 5.3 - Funções
PHP 5.3 - FunçõesPHP 5.3 - Funções
PHP 5.3 - Funções
George Mendonça
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - Tchelinux
Elton Minetto
 
Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação Web
Dalton Martins
 
InterCon 2016 - Software as a service usando Go como principal linguagem: os ...
InterCon 2016 - Software as a service usando Go como principal linguagem: os ...InterCon 2016 - Software as a service usando Go como principal linguagem: os ...
InterCon 2016 - Software as a service usando Go como principal linguagem: os ...
iMasters
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
Michael Castillo Granados
 
apostila.pdf
apostila.pdfapostila.pdf
apostila.pdf
DenilsonNunes13
 

Semelhante a ReactPHP && programacao assincrona em PHP (20)

Curso de Introdução - PHP
Curso de Introdução - PHPCurso de Introdução - PHP
Curso de Introdução - PHP
 
Php
PhpPhp
Php
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)
 
Al sweigart, cap 3
Al sweigart, cap 3Al sweigart, cap 3
Al sweigart, cap 3
 
React e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel CoutoReact e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel Couto
 
A Revolução dos Middlewares
A Revolução dos MiddlewaresA Revolução dos Middlewares
A Revolução dos Middlewares
 
LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - Funções
 
Doctrine for Dummies
Doctrine for DummiesDoctrine for Dummies
Doctrine for Dummies
 
A busca pelo deploy continuo
A busca pelo deploy continuoA busca pelo deploy continuo
A busca pelo deploy continuo
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
O que é que o Java não tem?
O que é que o Java não tem?O que é que o Java não tem?
O que é que o Java não tem?
 
PHP fora da Web
PHP fora da WebPHP fora da Web
PHP fora da Web
 
PHP 5.3 - Funções
PHP 5.3 - FunçõesPHP 5.3 - Funções
PHP 5.3 - Funções
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - Tchelinux
 
Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação Web
 
InterCon 2016 - Software as a service usando Go como principal linguagem: os ...
InterCon 2016 - Software as a service usando Go como principal linguagem: os ...InterCon 2016 - Software as a service usando Go como principal linguagem: os ...
InterCon 2016 - Software as a service usando Go como principal linguagem: os ...
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 
apostila.pdf
apostila.pdfapostila.pdf
apostila.pdf
 

Mais de Luis Gustavo Almeida

Curso de HTML5 CSS3 e JS
Curso de HTML5 CSS3 e JSCurso de HTML5 CSS3 e JS
Curso de HTML5 CSS3 e JS
Luis Gustavo Almeida
 
Geolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesGeolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e Routes
Luis Gustavo Almeida
 
Criando uma blockchain com PHP
Criando uma blockchain com PHPCriando uma blockchain com PHP
Criando uma blockchain com PHP
Luis Gustavo Almeida
 
Php criptomoedas e blockchain
Php criptomoedas e blockchainPhp criptomoedas e blockchain
Php criptomoedas e blockchain
Luis Gustavo Almeida
 
Palestra de segurança em PHP - Hacking
Palestra de segurança em PHP - HackingPalestra de segurança em PHP - Hacking
Palestra de segurança em PHP - Hacking
Luis Gustavo Almeida
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP
Luis Gustavo Almeida
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
Luis Gustavo Almeida
 
Migrando para PHP7 - Novidades
Migrando para PHP7 - NovidadesMigrando para PHP7 - Novidades
Migrando para PHP7 - Novidades
Luis Gustavo Almeida
 

Mais de Luis Gustavo Almeida (8)

Curso de HTML5 CSS3 e JS
Curso de HTML5 CSS3 e JSCurso de HTML5 CSS3 e JS
Curso de HTML5 CSS3 e JS
 
Geolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e RoutesGeolocalização em PHP - Google Places, Maps e Routes
Geolocalização em PHP - Google Places, Maps e Routes
 
Criando uma blockchain com PHP
Criando uma blockchain com PHPCriando uma blockchain com PHP
Criando uma blockchain com PHP
 
Php criptomoedas e blockchain
Php criptomoedas e blockchainPhp criptomoedas e blockchain
Php criptomoedas e blockchain
 
Palestra de segurança em PHP - Hacking
Palestra de segurança em PHP - HackingPalestra de segurança em PHP - Hacking
Palestra de segurança em PHP - Hacking
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
Migrando para PHP7 - Novidades
Migrando para PHP7 - NovidadesMigrando para PHP7 - Novidades
Migrando para PHP7 - Novidades
 

ReactPHP && programacao assincrona em PHP