Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

@femugsp sp.femug.com

Slide 5

Slide 5 text

@phpsp phpsp.org.br

Slide 6

Slide 6 text

Learning OOP in PHP Tutoriais, vídeos, slides, livros sobre OOP, OOD, design patterns, refatoração e arquitetura. bit.ly/Learning-OOP-in-PHP

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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!

Slide 9

Slide 9 text

Como o PHP é utilizado?

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

o servidor web recebe a requisição, delega o processamento para o interpretador PHP e envia a resposta para o cliente

Slide 12

Slide 12 text

ou seja, o ciclo de vida de um código PHP é somente durante o processo de requisição e resposta

Slide 13

Slide 13 text

arquitetura share-nothing
 todo estado dentro de um processo PHP tem vida curta e existe dentro de um único ciclo de vida

Slide 14

Slide 14 text

arquitetura share-nothing
 um processo PHP não tem conhecimento sobre os outros processos

Slide 15

Slide 15 text

modos de execução
 um programa PHP pode ser executado em um único processo ou em múltiplos threads

Slide 16

Slide 16 text

o modo de execução do PHP é uma decisão de arquitetura, mas pode trazer algumas limitações

Slide 17

Slide 17 text

o PHP foi criado para a web, mas hoje ele está além da web

Slide 18

Slide 18 text

inúmeras aplicações rodam em linha de comando como workers, crawlers e jobs

Slide 19

Slide 19 text

bit.ly/gameboy-php

Slide 20

Slide 20 text

Caso de Uso 1

Slide 21

Slide 21 text

Caso de Uso 1
 um aplicação de linha de comando que extrai o preço dos produtos de um e- commerce

Slide 22

Slide 22 text

Quais são os desafios?
 Desempenho? É possível fazer requisições em paralelo? Como arquitetar o código?

Slide 23

Slide 23 text

1. sequencial
 2. multi-processos
 3. multi-thread
 4. programação assíncrona abordagens

Slide 24

Slide 24 text

O que são processos e threads?

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

threads
 são linhas de execução dentro de um processo que possui acesso ao mesmo espaço de endereçamento

Slide 28

Slide 28 text

threads
 são mais leves que processos e são fáceis e rápido de criar e destruir

Slide 29

Slide 29 text

threads
 criar um thread é algo de 10 a 100 vezes mais rápido do que criar processos

Slide 30

Slide 30 text

threads
 a criação de múltiplos threads é feita para trabalhar juntos para desempenhar alguma tarefa

Slide 31

Slide 31 text

threads
 programas multithread devem ser pensados e projetados com cuidado para funcionarem corretamente

Slide 32

Slide 32 text

O que é paralelismo e concorrência?

Slide 33

Slide 33 text

paralelismo
 é quando duas ou mais tarefas são executadas literalmente ao mesmo tempo

Slide 34

Slide 34 text

paralelismo
 necessita de um processador com múltiplos núcleos ou múltiplos processadores

Slide 35

Slide 35 text

concorrência
 é quando mais de uma tarefa é executada no mesmo intervalo de tempo mesmo que não estejam em execução no mesmo instante

Slide 36

Slide 36 text

sistemas multitarefas
 são sistemas em que mais de um programa podem estar em execução ao mesmo tempo

Slide 37

Slide 37 text

O que é programação síncrona e assíncrona?

Slide 38

Slide 38 text

programação síncrona
 é quando uma instrução depende da finalização de outra instrução para ser executada

Slide 39

Slide 39 text

instrução 1 instrução 2 instrução 3 instrução 4 tempo

Slide 40

Slide 40 text

!// 01 - sync code sleep(3); echo "Hello Codecon Joinville”; !// waits for 3s and shows the message

Slide 41

Slide 41 text

um código síncrono é simples de entender e fácil de ler

Slide 42

Slide 42 text

programação assíncrona
 é quando uma instrução não depende da finalização de outra instrução para ser executada

Slide 43

Slide 43 text

esperando I/O instrução 1 instrução 2 instrução 3 instrução 4 tempo instrução 2

Slide 44

Slide 44 text

!// 02 - async code setTimeout(function() { console.log('Hello everyone!'); }, 3000); console.log('Hello Codecon Joinville’); !// shows the message and after 3s shows another message

Slide 45

Slide 45 text

!// 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

Slide 46

Slide 46 text

um código assíncrono é complicado de entender e difícil de ler

Slide 47

Slide 47 text

programação assíncrona
 as operações custosas são enfileiradas e retomadas posteriormente quando estiverem disponíveis

Slide 48

Slide 48 text

programação síncrona (problemas)
 lidar com operações custosas como escritas em disco ou comunicação em rede

Slide 49

Slide 49 text

O que é código bloqueante e não-bloqueante?

Slide 50

Slide 50 text

um código bloqueante é aquele que bloqueia a execução de uma instrução até que a instrução anterior seja finalizada

Slide 51

Slide 51 text

o conceito foi inventado para tornar a programação mais fácil

Slide 52

Slide 52 text

o espirro é algo bloqueante, ou seja, paramos “tudo” o que estamos fazendo quando vamos espirrar!

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

o ser humano é multitarefa e pode andar, falar e comer ao mesmo tempo, ou seja, são tarefas não-bloqueantes

Slide 55

Slide 55 text

o hardware de um computador funciona de forma não-bloqueante e assíncrona

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

No content

Slide 58

Slide 58 text

perde-se muitos ciclos de CPU quando se espera disco e rede

Slide 59

Slide 59 text

esse é o motivo pelo qual o hardware é assíncrono

Slide 60

Slide 60 text

queremos a CPU rodando na capacidade máxima

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

ReactPHP

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

Event-loop

Slide 67

Slide 67 text

event-loop
 componente que permite alcançar a programação assíncrona sem precisar recorrer às threads

Slide 68

Slide 68 text

event-loop
 componente de mais baixo nível e o coração do ReactPHP

Slide 69

Slide 69 text

event-loop
 roda em uma única thread e é responsável por agendar as operações assíncronas

Slide 70

Slide 70 text

event-loop
 implementa o Reactor Pattern

Slide 71

Slide 71 text

event-loop
 é um loop infinito que verifica por eventos e reage quando eles ocorrem

Slide 72

Slide 72 text

event-loop
 possui quatro implementações, uma nativa e três extensões

Slide 73

Slide 73 text

!// 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)

Slide 74

Slide 74 text

event-loop
 deve-se evitar bloquear a thread já que o loop é executado em apenas uma thread

Slide 75

Slide 75 text

!// 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)

Slide 76

Slide 76 text

event-loop
 lembre-se que assíncrono é diferente de paralelo

Slide 77

Slide 77 text

Streams

Slide 78

Slide 78 text

streams
 são uma forma de generalizar arquivo, rede e outras operações que compartilham um conjunto comum de funções e usos

Slide 79

Slide 79 text

streams
 permite utilizar grandes quantidades de dados em pedaços menores

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

1. readable (STDIN)
 2. writable (STDOUT)
 3. duplex (TCP Sockets) três tipos de streams

Slide 82

Slide 82 text

!// 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

Slide 83

Slide 83 text

Promises e deferreds

Slide 84

Slide 84 text

deferred
 representa um trabalho que ainda não foi terminado

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

um objeto de deferred pode utilizar os métodos resolve() e reject() para mudar o estado de uma promise

Slide 88

Slide 88 text

as promises fornecem os métodos then(), done(), otherwise() e always()

Slide 89

Slide 89 text

!// 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

Slide 90

Slide 90 text

Caso de Uso 2

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

No content

Slide 93

Slide 93 text

No content

Slide 94

Slide 94 text

No content

Slide 95

Slide 95 text

No content

Slide 96

Slide 96 text

abordagem síncrona abordagem assíncrona 16,7s 3,8s

Slide 97

Slide 97 text

Outras bibliotecas

Slide 98

Slide 98 text

1. Amp
 2. Swoole
 3. PHP-PM 
 4. Kraken PHP 5. Ratchet Outras bibliotecas

Slide 99

Slide 99 text

Conclusão

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

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

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

Referências

Slide 104

Slide 104 text

bit.ly/referencias-palestra-async-php

Slide 105

Slide 105 text

Avalie!

Slide 106

Slide 106 text

bit.ly/avalie-palestra-async-php

Slide 107

Slide 107 text

Anúncio!

Slide 108

Slide 108 text

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.

Slide 109

Slide 109 text

@marcelgsantos speakerdeck.com/marcelgsantos Obrigado. Perguntas?