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

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 CalisthenicsGuilherme Blanco
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e SphinxElton Minetto
 
Why functional programming matters
Why functional programming mattersWhy functional programming matters
Why functional programming mattersJean Carlo Machado
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE PoliglotaPhil Calçado
 
Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3garux
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5garux
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkMarcelo Rodrigo
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - FlisolLeonn 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.3Jose 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
 
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

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 GearmanElton Minetto
 
As novidades do PHP5 (2005)
As novidades do PHP5 (2005)As novidades do PHP5 (2005)
As novidades do PHP5 (2005)Pablo Dall'Oglio
 
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 CoutoiMasters
 
LabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesLabMM4 (T13 - 12/13) - Funções
LabMM4 (T13 - 12/13) - FunçõesCarlos Santos
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que pareceImpacta 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
 
Otimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxOtimizando aplicações Zend Framework - Tchelinux
Otimizando aplicações Zend Framework - TchelinuxElton 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 WebDalton 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
 

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

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 RoutesLuis 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 - HackingLuis 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
 

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