Processamento assíncrono
com PHP
Fernando Fabricio dos Santos
devparana.org
Objetivos
● Definição de fluxos síncronos e assíncronos
● O que são sinais e interrupções?
● Qual a finalidade?
● Como funcionam os sinais?
● Como devo tratá-los?
Avisos
● Estamos falando de PHP para uso em processos
● A extensão pcntl não funciona no windows
Extensão
Para utilizar sinais com PHP é necessário a extensão PCNTL habilitada
Modelo de Fluxo
SÍNCRONO vs ASSÍNCRONO
https://thenerdsofcolor.files.wordpress.com/2014/10/civil-war-mcu-e1413315304464.jpeg
Fluxo síncrono
● Uma tarefa executada por vez
● Executadas em sequência
● Tarefas são sempre executadas na mesma ordem
● Um erro pode impedir a execução de tarefas
posteriores
http://cs.brown.edu/courses/cs168/s12/handouts/async.pdf
Thread
● Múltiplas Threads
● Tarefas executadas ao mesmo tempo
● Tarefas são executadas independente do resultado obtido pela anterior
http://cs.brown.edu/courses/cs168/s12/handouts/async.pdf
Fluxo assíncrono
● Controle da execução pode ser feito no próprio
software
● É executado no mesmo processo
● Callbacks (call_user_func ou outra função que
receba um callback como parâmetro)
http://cs.brown.edu/courses/cs168/s12/handouts/async.pdf
http://arquiteturadeinformacao.com/usabilidade
Como funciona uma fila?
docker-compose.yml
rabbit:
image: rabbitmq
ports:
- "5672:5672"
composer.json
{
"name": "ffsantos/teste",
"require": {
"php-amqplib/php-amqplib": "^2.6"
}
}
sender.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;
$connection = new AMQPStreamConnection(
'localhost',
5672,
'guest',
'guest'
);
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello');
echo " [x] Sent 'Hello World!'n";
consumer.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLibConnectionAMQPStreamConnection;
$connection = new AMQPStreamConnection(
'localhost',
5672,
'guest',
'guest'
);
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
echo ' [*] Waiting for messages. To exit press CTRL+C', "n";
$callback = function ($msg) {
echo " [x] Received ", $msg->body, "n";
};
$channel->basic_consume('hello', '', false, true, false, false, $callback);
while (count($channel->callbacks)) {
$channel->wait();
}
Perguntas?

Processamento Assíncrono com PHP