Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introdução a Programação Assíncrona em PHP

Introdução a Programação Assíncrona em PHP

O ecossistema de PHP tem crescido imensamente nos últimos anos e diversos conceitos e ferramentas têm se consolidado. Um deles é a programação assíncrona. Nesta palestra serão abordados os conceitos de programação assíncrona, programação baseada em eventos, event-loop, streams, promises entre outros. Serão apresentados casos de usos em que podemos nos beneficiar da programação assíncrona e serão apresentadas bibliotecas e ferramentas que fornecem suporte e/ou fazem uso de programação assíncrona.

Marcel dos Santos

August 31, 2019
Tweet

More Decks by Marcel dos Santos

Other Decks in Programming

Transcript

  1. Learning OOP in PHP Tutoriais, vídeos, slides, livros sobre OOP,

    OOD, design patterns, refatoração e arquitetura. bit.ly/Learning-OOP-in-PHP
  2. Interaja nas mídias sociais!
 
 - fale sobre o evento,

    palestrantes e conteúdo - tire fotos do evento e publique
 - interaja com outros participantes do evento - tire dúvidas ou dê feedbacks para os palestrantes
  3. 1. seguir @marcelgsantos no Twitter
 2. tuitar utilizando as hashtags

    #codecon19,
 #async e #reactphp
 3. não vale tuíte em branco e retuíte
 4. ler e preencher este simples formulário
 bit.ly/sorteio-codecon Concorra a um livro da Casa do Código!
  4. o servidor web recebe a requisição, delega o processamento para

    o interpretador PHP e envia a resposta para o cliente
  5. ou seja, o ciclo de vida de um código PHP

    é somente durante o processo de requisição e resposta
  6. arquitetura share-nothing
 todo estado dentro de um processo PHP tem

    vida curta e existe dentro de um único ciclo de vida
  7. modos de execução
 um programa PHP pode ser executado em

    um único processo ou em múltiplos threads
  8. o modo de execução do PHP é uma decisão de

    arquitetura, mas pode trazer algumas limitações
  9. Caso de Uso 1
 um aplicação de linha de comando

    que extrai o preço dos produtos de um e- commerce
  10. threads
 são linhas de execução dentro de um processo que

    possui acesso ao mesmo espaço de endereçamento
  11. threads
 criar um thread é algo de 10 a 100

    vezes mais rápido do que criar processos
  12. concorrência
 é quando mais de uma tarefa é executada no

    mesmo intervalo de tempo mesmo que não estejam em execução no mesmo instante
  13. !// 02 - async code setTimeout(function() { console.log('Hello everyone!'); },

    3000); console.log('Hello Codecon Joinville’); !// shows the message and after 3s shows another message
  14. !// 03 - async code $loop = React\EventLoop\Factory!::create(); $loop!->addTimer(3, function

    () { echo 'Hello everyone!'; }); echo 'Hello Codecon Joinville’ . PHP_EOL; $loop!->run(); !// shows the message and after 3s shows another message
  15. um código bloqueante é aquele que bloqueia a execução de

    uma instrução até que a instrução anterior seja finalizada
  16. o espirro é algo bloqueante, ou seja, paramos “tudo” o

    que estamos fazendo quando vamos espirrar!
  17. um código não-bloqueante é aquele que não bloqueia a execução

    de uma instrução com base em uma instrução anterior não finalizada
  18. o ser humano é multitarefa e pode andar, falar e

    comer ao mesmo tempo, ou seja, são tarefas não-bloqueantes
  19. !// 04 - create a loop
 
 $loop = React\EventLoop\Factory!::create();

    $loop!->addTimer(1, function() { echo "after timer" . PHP_EOL; }); echo "before timer" . PHP_EOL; $loop!->run();
 !// before timer !// after timer (1s after)
  20. !// 05 - blocking the loop $loop = React\EventLoop\Factory!::create(); $loop!->addTimer(1,

    function () { sleep(5); }); $loop!->addPeriodicTimer(1, function() { echo "hello" . PHP_EOL; }); $loop!->run(); !// blocked for 5s !// hello (every second)
  21. streams
 são uma forma de generalizar arquivo, rede e outras

    operações que compartilham um conjunto comum de funções e usos
  22. !// 06 - readable and writable stream $loop = React\EventLoop\Factory!::create();

    $readable = new ReadableResourceStream(STDIN, $loop); $writable = new WritableResourceStream(STDOUT, $loop); $readable!->on('data', function($chunk) use ($writable) { $writable!->write($chunk); }); $loop!->run(); !// echo 'hello world' | php streams-writable.php !// hello world
  23. 1. unfulfilled - valor inicial e desconhecido
 2. fulfilled -

    valor retornado para a promise
 3. failed - ocorreu uma exceção durante a execução estados de uma promise
  24. um objeto de deferred pode utilizar os métodos resolve() e

    reject() para mudar o estado de uma promise
  25. !// 07 - deferred and promise $deferred = new React\Promise\Deferred();

    $promise = $deferred!->promise(); $promise!->done(function($data) { echo 'Done: ' . $data . PHP_EOL; }); $deferred!->resolve('hello world'); !// Done: hello world
  26. Caso de Uso 2
 aplicação que acessa um perfil do

    SpeakerDeck, obtém os links dos slides, acessa cada um deles e extrai o título, descrição, estrelas e visualizações
  27. bit.ly/workshop-php74 Informações: será apresentado um histórico breve da linguagem, as

    principais funcionalidades do PHP 7.4 de forma prática como typed properties, arrow functions, spread operator, preloading, FFI entre outras e funcionalidades futuras do PHP 8.0.