Slide 1

Slide 1 text

PHP Assíncrono com ReactPHP PHP vs Node.js

Slide 2

Slide 2 text

Who am I? ● Programador ● Desenvolvedor web ● WebDesigner wannabe ● Leroy Merlin (Laravel) ● Sempre mais http://zizaco.net Luiz Fernando / Zizaco

Slide 3

Slide 3 text

Request Lifecycle HTTP:// WebServer PHP External Services File System External Services Cache

Slide 4

Slide 4 text

Laravel Request Lifecycle HTTP:// WebServer External Services HTTP Kernel Service Providers index.php autoload Routes Controller

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Express (Node.js) Request Lifecycle HTTP:// WebServer External Services AppServer Middlewares index.js require(...) Routes Controller(?) Opcional

Slide 7

Slide 7 text

Laravel Request Lifecycle HTTP:// WebServer External Services HTTP Kernel Service Providers index.php autoload Routes Controller

Slide 8

Slide 8 text

PHP Approach Request Lifecycle HTTP:// WebServer External Services AppServer Stuff index.php autoload Routes Controller Opcional

Slide 9

Slide 9 text

PHP HTTP Server

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

Node.js HTTP Server

Slide 12

Slide 12 text

IO Bloqueante IO CPU IO CPU IO CPU

Slide 13

Slide 13 text

IO Bloqueante L1 cache reference 0.000001 ms Main memory reference 0.0001 ms Enviar 1 Kb por uma conexão 1 Gbps 0.010 ms Disk seek 10 ms Ler 1 MB do HD 20 ms Round trip Brazil - EUA 150 ms IO CPU IO CPU IO CPU

Slide 14

Slide 14 text

IO Não Bloqueante IO CPU IO CPU IO CPU

Slide 15

Slide 15 text

IO Não Bloqueante How to? EventLoop & Reactor Pattern

Slide 16

Slide 16 text

IO Não Bloqueante How to? EventLoop & Reactor Pattern "EventLoop is a programming construct that waits for and dispatches events or messages in a program & The reactor design pattern is an event handling pattern ..."

Slide 17

Slide 17 text

IO Não Bloqueante How to? select | epoll "A system call to examine the status of file descriptors of open input/output channels. | A scalable I/O event notification mechanism"

Slide 18

Slide 18 text

IO Não Bloqueante How to? File-based EventLoop "The select and poll system calls allow a set of file descriptors to be monitored for a change of state, [...] by using files to trigger and listen to events, the loop will block if there are no events ready."

Slide 19

Slide 19 text

IO Não Bloqueante How to? File-based EventLoop "The select and poll system calls allow a set of file descriptors to be monitored for a change of state, [...] by using files to trigger and listen to events, the loop will block if there are no events ready."

Slide 20

Slide 20 text

Node.js HTTP Server

Slide 21

Slide 21 text

ReactPHP HTTP Server

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

Programando Event Driven [✓] The good [✓] The bad [✓] The ugly

Slide 25

Slide 25 text

Operações Bloqueantes $result = syncAction($param1, $param2); asyncAction($param1, $param2, Callable $callback); Operações não Bloqueantes

Slide 26

Slide 26 text

Operações Bloqueantes $result = syncAction($param1, $param2); asyncAction($param1, $param2, Callable $callback); Operações não Bloqueantes Callback Hell

Slide 27

Slide 27 text

Node.js Callback Hell

Slide 28

Slide 28 text

Operações Bloqueantes Operações não Bloqueantes $result = syncAction($param1, $param2); asyncAction($param1, $param2, Callable $callback); $promise = asyncAction($param1, $param2); $promise->done(Callable $callback);

Slide 29

Slide 29 text

Packages/Libs Bloqueantes Packages/Libs não Bloqueantes 90% github.com/react/* & packages for ReactPHP

Slide 30

Slide 30 text

ReactPHP's ChildProcess Roda qualquer processo de forma assíncrona (EventDriven)

Slide 31

Slide 31 text

ReactPHP's ChildProcess Roda qualquer processo de forma assíncrona (EventDriven)

Slide 32

Slide 32 text

ReactPHP's ChildProcess Roda qualquer processo de forma assíncrona (EventDriven) nodejs.org/api/child_process.html

Slide 33

Slide 33 text

Why?

Slide 34

Slide 34 text

Quando usar ReactPHP/Node? ● Chat ● APIs ● Queued Input ● Data Streaming ● Proxy ● Monitoring ● Web Applications with NoSQL

Slide 35

Slide 35 text

Quando não usar ReactPHP/Node ● Web Applications with Relational Database ● Heavy Processing (CPU Intensive)

Slide 36

Slide 36 text

Node.js ReactPHP VS

Slide 37

Slide 37 text

Node.js ReactPHP ● + Packages / Libs ● Javascript ○ Compatível com Front-end ● + Maduro ● OOP decente ● PHP ○ Compatível com código Back-end ● + Padronizado

Slide 38

Slide 38 text

Node.js ReactPHP ● + Packages / Libs ● Javascript ○ Compatível com Front-end ● + Maduro ● OOP decente ● PHP ○ Compatível com código Back-end ● + Padronizado

Slide 39

Slide 39 text

Remember...

Slide 40

Slide 40 text

Don't do cargo cult programming

Slide 41

Slide 41 text

Trabalhe conosco (: Backend / Frontend [email protected] Subject: [Vaga]

Slide 42

Slide 42 text

Fontes ReactPHP http://reactphp.org/ Why Use Node.js? - Tomislav Capan http://www.toptal.com/nodejs/why-the-hell-would-i-use-node-js Async PHP With React (Laracon) - Jeremy Mikola https://www.youtube.com/watch?v=s6xrnYae1FU Laravel Request Lifecycle http://laravel.com/docs/5.0/lifecycle Event Correlation: What you Need to Know For IT Operations Management - Michael Johnson http://goo.gl/0bZFaP Callback Hell - Max Ogden http://callbackhell.com/

Slide 43

Slide 43 text

Fontes Understanding the node.js event loop - Mikito Takada http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ Promises - Forbes Lindesay https://www.promisejs.org/ I/O não bloqueante com select “na unha” (Perl) - Tiago Peczenyj http://imasters.com.br/desenvolvimento/io-nao-bloqueante-com-ioselect-na-unha/ Reactor Pattern - Douglas C. Schmidt http://www.dre.vanderbilt.edu/~schmidt/PDF/reactor-siemens.pdf Differences between event driven model and reactor pattern? - Jean-Paul Calderone http://stackoverflow.com/a/9143390 Cargo Cult Programming http://en.wikipedia.org/wiki/Cargo_cult_programming