Slide 1

Slide 1 text

PHP DISTRIBUÍDO E PARALELO Multithread + Stream Sockets

Slide 2

Slide 2 text

Diana Ungaro Arnos tech daymio @ high stakes academy evangelist @ PHP Women

Slide 3

Slide 3 text

EU USO LOAD BALANCER, MEU SISTEMA É DISTRIBUÍDO. NÃO!

Slide 4

Slide 4 text

DISTRIBUIR ACESSOS NÃO É O MESMO QUE DISTRIBUIR PROCESSAMENTO. LOAD BALANCER SERVIDOR APLICAÇÃO SERVIDOR APLICAÇÃO SERVIDOR APLICAÇÃO

Slide 5

Slide 5 text

O PROCESSAMENTO DA TAREFA É DISTRIBUÍDO EM PARALELO ENTRE MÁQUINAS DIFERENTES APLICAÇÃO SERVIDOR SERVIDOR SERVIDOR SOLICITA TAREFA X X PARTE 1 X PARTE 2 X PARTE 3

Slide 6

Slide 6 text

XML XML XML XML MÁQUINA 1 XML MÁQUINA 2 XML MÁQUINA 3 XML

Slide 7

Slide 7 text

PROCESSAMENTO PARALELO DISTRIBUÍDO COM PHP? MULTI THREAD? DISTRIBUÍDO E PARALELO? PTHREADS PTHREADS + STREAM SOCKETS

Slide 8

Slide 8 text

PTHREADS PHP COMPILADO COM ZTS (THREAD SAFETY) V3 : FOI REESCRITO E É 100% COMPATÍVEL COM PHP 7 PARA USAR COM PHP5: V2 É SEGURO

Slide 9

Slide 9 text

PTHREADS class SimpleThreadExample extends \Thread { /** @var int */ private $workerId = 0; public function __construct($id) { $this->workerId = $id; } public function run() { echo "Thread " . $this->workerId . " começou a executar.\n"; sleep(rand(0, 3)); echo "Thread " . $this->workerId . " parou de executar.\n"; } }

Slide 10

Slide 10 text

PTHREADS $workerPool = []; foreach (range(0, 10) as $id) { $workerPool[$id] = new SimpleThreadExample($id); $workerPool[$id]->start(); } foreach (range(0, 10) as $id) { $workerPool[$id]->join(); }

Slide 11

Slide 11 text

PTHREADS Thread 0 começou a executar. Thread 1 começou a executar. Thread 2 começou a executar. Thread 0 parou de executar. Thread 3 começou a executar. Thread 1 parou de executar. Thread 4 começou a executar. Thread 2 parou de executar. Thread 3 parou de executar. Thread 4 parou de executar.

Slide 12

Slide 12 text

STREAM SOCKETS SOCKETS: MECANISMO DE COMUNICAÇÃO ENTRE PROCESSOS - EM MODELO CLIENTE/SERVIDOR => 1P + PORTA. EX.: 127.0.0.1:80 STREAM SOCKETS: $server = stream_socket_server(”tcp://192.168.33.99”, $errorNum, $errorMsg); while ($conn = stream_socket_accept($server)) { //código} $client = stream_socket_client("tcp://$this->workerHost", $errorNum, $errorMsg, 10); fclose($client); - fgets(), fclose(), fread(), ETC…

Slide 13

Slide 13 text

DISTRIBUINDO O PROCESSAMENTO NO EXEMPLO DO XML: - UM SCRIPT DE SCRAPPING QUE RECEBE O PEDAÇO DE XML class Scrapper { //código public function run() { $server = stream_socket_server("tcp://$this->socket", $errorNum, $errorMsg); while ($conn = stream_socket_accept($server)) { // código de scrapping } fclose($server); } } $scrapper= new Scrapper($argv); $scrapper >run();

Slide 14

Slide 14 text

DISTRIBUINDO O PROCESSAMENTO - O CLIENT QUE FAZ A REQUISIÇÃO class Client { //código private function sendFilePiecesToWorkers($xml) { //código foreach ($this->scrappersAdderss as $scrapper) { $this->senderPool[$scrapper] = new Sender($scrapper, $xml); $this->senderPool[$ scrapper]->start(); } foreach ($this->senderPool as $sender) { $sender->join(); echo "Encerrando thread...\n"; array_push($results, $sender->result); } } }

Slide 15

Slide 15 text

DISTRIBUINDO O PROCESSAMENTO - O SENDER, RESPONSÁVEL POR ENVIAR OS PEDAÇOS AOS SCRAPPERS class Sender extends \Thread { //código public function run() { $client = stream_socket_client("tcp://$this->scrapperHost", $errorNum, $errorMsg, 10); //código foreach ($this->scrappersAdderss as $scrapper) { //código $this->result = stream_get_contents($client); } fclose($client); } }

Slide 16

Slide 16 text

OBRIGADA! https://joind.in/talk/f0272 @dianaarnos INSTAGRAM E TWITTER FACEBOOK fb.com/dianaarnos