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.

52711e2157a6fed933b0361cc06a6953?s=128

Marcel dos Santos

August 31, 2019
Tweet

Transcript

  1. Marcel Gonçalves dos Santos @marcelgsantos programação assíncrona Introdução a em

    PHP
  2. pensandonaweb.com.br desenvolvedor web full-stack Marcel Gonçalves dos Santos @marcelgsantos

  3. None
  4. @femugsp sp.femug.com

  5. @phpsp phpsp.org.br

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

    OOD, design patterns, refatoração e arquitetura. bit.ly/Learning-OOP-in-PHP
  7. 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
  8. 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!
  9. Como o PHP é utilizado?

  10. ele é normalmente utilizado para o processamento de requisições web

  11. o servidor web recebe a requisição, delega o processamento para

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

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

    vida curta e existe dentro de um único ciclo de vida
  14. arquitetura share-nothing
 um processo PHP não tem conhecimento sobre os

    outros processos
  15. modos de execução
 um programa PHP pode ser executado em

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

    arquitetura, mas pode trazer algumas limitações
  17. o PHP foi criado para a web, mas hoje ele

    está além da web
  18. inúmeras aplicações rodam em linha de comando como workers, crawlers

    e jobs
  19. bit.ly/gameboy-php

  20. Caso de Uso 1

  21. Caso de Uso 1
 um aplicação de linha de comando

    que extrai o preço dos produtos de um e- commerce
  22. Quais são os desafios?
 Desempenho? É possível fazer requisições em

    paralelo? Como arquitetar o código?
  23. 1. sequencial
 2. multi-processos
 3. multi-thread
 4. programação assíncrona abordagens

  24. O que são processos e threads?

  25. processo é uma abstração de um programa em execução

  26. processo o conceito de processo permite que existam operações concorrentes

  27. threads
 são linhas de execução dentro de um processo que

    possui acesso ao mesmo espaço de endereçamento
  28. threads
 são mais leves que processos e são fáceis e

    rápido de criar e destruir
  29. threads
 criar um thread é algo de 10 a 100

    vezes mais rápido do que criar processos
  30. threads
 a criação de múltiplos threads é feita para trabalhar

    juntos para desempenhar alguma tarefa
  31. threads
 programas multithread devem ser pensados e projetados com cuidado

    para funcionarem corretamente
  32. O que é paralelismo e concorrência?

  33. paralelismo
 é quando duas ou mais tarefas são executadas literalmente

    ao mesmo tempo
  34. paralelismo
 necessita de um processador com múltiplos núcleos ou múltiplos

    processadores
  35. concorrência
 é quando mais de uma tarefa é executada no

    mesmo intervalo de tempo mesmo que não estejam em execução no mesmo instante
  36. sistemas multitarefas
 são sistemas em que mais de um programa

    podem estar em execução ao mesmo tempo
  37. O que é programação síncrona e assíncrona?

  38. programação síncrona
 é quando uma instrução depende da finalização de

    outra instrução para ser executada
  39. instrução 1 instrução 2 instrução 3 instrução 4 tempo

  40. !// 01 - sync code sleep(3); echo "Hello Codecon Joinville”;

    !// waits for 3s and shows the message
  41. um código síncrono é simples de entender e fácil de

    ler
  42. programação assíncrona
 é quando uma instrução não depende da finalização

    de outra instrução para ser executada
  43. esperando I/O instrução 1 instrução 2 instrução 3 instrução 4

    tempo instrução 2
  44. !// 02 - async code setTimeout(function() { console.log('Hello everyone!'); },

    3000); console.log('Hello Codecon Joinville’); !// shows the message and after 3s shows another message
  45. !// 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
  46. um código assíncrono é complicado de entender e difícil de

    ler
  47. programação assíncrona
 as operações custosas são enfileiradas e retomadas posteriormente

    quando estiverem disponíveis
  48. programação síncrona (problemas)
 lidar com operações custosas como escritas em

    disco ou comunicação em rede
  49. O que é código bloqueante e não-bloqueante?

  50. um código bloqueante é aquele que bloqueia a execução de

    uma instrução até que a instrução anterior seja finalizada
  51. o conceito foi inventado para tornar a programação mais fácil

  52. o espirro é algo bloqueante, ou seja, paramos “tudo” o

    que estamos fazendo quando vamos espirrar!
  53. 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
  54. o ser humano é multitarefa e pode andar, falar e

    comer ao mesmo tempo, ou seja, são tarefas não-bloqueantes
  55. o hardware de um computador funciona de forma não-bloqueante e

    assíncrona
  56. é a linguagem que adiciona a semântica bloqueante e síncrona

  57. None
  58. perde-se muitos ciclos de CPU quando se espera disco e

    rede
  59. esse é o motivo pelo qual o hardware é assíncrono

  60. queremos a CPU rodando na capacidade máxima

  61. ou seja, assíncrono e não-bloqueante possui melhor desempenho

  62. ReactPHP

  63. é um conjunto de bibliotecas utilizadas para programação assíncrona

  64. é orientada a eventos e com I/O não bloquante

  65. as principais bibliotecas são event-loop, streams e promises

  66. Event-loop

  67. event-loop
 componente que permite alcançar a programação assíncrona sem precisar

    recorrer às threads
  68. event-loop
 componente de mais baixo nível e o coração do

    ReactPHP
  69. event-loop
 roda em uma única thread e é responsável por

    agendar as operações assíncronas
  70. event-loop
 implementa o Reactor Pattern

  71. event-loop
 é um loop infinito que verifica por eventos e

    reage quando eles ocorrem
  72. event-loop
 possui quatro implementações, uma nativa e três extensões

  73. !// 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)
  74. event-loop
 deve-se evitar bloquear a thread já que o loop

    é executado em apenas uma thread
  75. !// 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)
  76. event-loop
 lembre-se que assíncrono é diferente de paralelo

  77. Streams

  78. streams
 são uma forma de generalizar arquivo, rede e outras

    operações que compartilham um conjunto comum de funções e usos
  79. streams
 permite utilizar grandes quantidades de dados em pedaços menores

  80. streams
 permite uma utilização eficiente de memória

  81. 1. readable (STDIN)
 2. writable (STDOUT)
 3. duplex (TCP Sockets)

    três tipos de streams
  82. !// 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
  83. Promises e deferreds

  84. deferred
 representa um trabalho que ainda não foi terminado

  85. promise
 é um resultado retornado por algum código assíncrono

  86. 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
  87. um objeto de deferred pode utilizar os métodos resolve() e

    reject() para mudar o estado de uma promise
  88. as promises fornecem os métodos then(), done(), otherwise() e always()

  89. !// 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
  90. Caso de Uso 2

  91. 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
  92. None
  93. None
  94. None
  95. None
  96. abordagem síncrona abordagem assíncrona 16,7s 3,8s

  97. Outras bibliotecas

  98. 1. Amp
 2. Swoole
 3. PHP-PM 
 4. Kraken PHP

    5. Ratchet Outras bibliotecas
  99. Conclusão

  100. é importante conhecer outras abordagens para solução de problemas

  101. a programação assíncrona é abordagem consolidada e comprovada

  102. e a programação assíncrona em PHP é robusta e madura

  103. Referências

  104. bit.ly/referencias-palestra-async-php

  105. Avalie!

  106. bit.ly/avalie-palestra-async-php

  107. Anúncio!

  108. 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.
  109. @marcelgsantos speakerdeck.com/marcelgsantos Obrigado. Perguntas?