Upload
fernando-fabricio
View
143
Download
2
Embed Size (px)
Citation preview
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ãoPara 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 PhpAmqpLib\Connection\AMQPStreamConnection;use PhpAmqpLib\Message\AMQPMessage;
$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 PhpAmqpLib\Connection\AMQPStreamConnection;
$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?