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