PHP Assíncrono: I/O Não-Bloqueante, Event-Loop e Coroutines
Porque ferramentas como a Swoole tornam o PHP competitivo.
Olá
Leo Cavalcante
Staff Engineer e Skill Lead
Developer Experience na PicPay
Open-sourcerer
Swoole e Hyperf
PHP-FIG
OpenCodeCo
Não é só código
5AM 5KM
Músico frustrado
Marceneiro de pandemia
PHP competitivo
TechEmpower
Rinha de Backend
PHP = Rust, Go, Java, C#, Elixir, Node.js etc
Ao mesmo tempo
Não esperar pelo anterior
Não interromper a execução
Mais de um por vez
Assíncrono
Concorrente
Paralelo
Não-bloqueante
Analogia do garçom
Recepciona
Anota o pedido
Traz o prato
Garçom síncrono
Espera a escolha do pedido
Espera a cozinha finalizar o prato
Espera…
Porque analogia
Restaurante é o servidor
Garçom são os recursos (RAM, CPU)
Clientes são as requisições
Multitarefa
Fazer mais de uma coisa ao mesmo
Aproveitar recursos computacionais ociosos
Produtividade e eficiência
Multitasking OS
Mais de um programa
Memória virtual
Processos
Na computação
Processos
Threads
Fibers (Virtual Threads, Green Threads, Lightweight Threads)
Processos
Java Pesado (RAM)
Context switch (CPU)
I/O continua bloqueado
Threads
Syscalls
Memória compartilhada
Dead-locks, race conditions, mutexes
Era o que tinha
Apache
Pool de processos
Pool de threads
WWW
World
Wide
Web
C10k problem
Dan Kegel
10 mil conexões simultâneas
Eficiênte (menor quantidade de recursos)
Web é I/O
Receber e enviar requisições HTTP
Banco de dados
Rede no geral
NGINX
Igor Sysoev
Engine X
Nasceu pra resolver o C10k problem
I/O não-bloqueante
Event-loop
Reactor
Single-threaded
I/O (Unix)
File descriptors
Pipes
Sockets
I/O (Linux)
select
poll
epoll
Event-loop (Reactor)
Node.js (JavaScript)
Tornado (Python)
Swoole (PHP)
Swoole
Rápido
Preciso
Como uma espada (Sword)
Melhor dos mundos
Multi-processing
Multi-threaded
Coroutines (Fibers)
Sincronizar o assíncrono
Callbacks
Promises/Futures
async/await
Coroutines
Rotinas (Fibers)
Que cooperam (Co)
Preemptivas (Scheduler)
Hello, Swoole!
use Swoole\Coroutine;
Coroutine::create(function () {
Coroutine::sleep(1.0);
echo ' ';
});
Coroutine::create(function () {
Coroutine::sleep(2.0);
echo 'World!';
});
Coroutine::create(function () {
Coroutine::sleep(0.5);
echo 'Hello,';
});
$ phpctl php hello_world.php
> Hello, World!
Time
use Swoole\Coroutine;
Coroutine::create(function () {
Coroutine::sleep(1);
echo '1';
});
Coroutine::create(function () {
Coroutine::sleep(1);
echo '2';
});
Coroutine::create(function () {
Coroutine::sleep(1);
echo '3';
});
$ time phpctl php time.php
132
phpctl php time.php
0.02s user
0.00s system
1% cpu
1.666 total
Text
PHP Assíncrono: I/O Não-Bloqueante, Event-Loop e Coroutines
By Leo Cavalcante
PHP Assíncrono: I/O Não-Bloqueante, Event-Loop e Coroutines
- 126