Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP distribuído e paralelo: multithread, stream sockets e docker

Diana Arnos
November 11, 2017

PHP distribuído e paralelo: multithread, stream sockets e docker

Apresentada no Women Dev Summit, 2017
http://womendevsummit.com

A ideia é fazer uma explicação suscinta sobre o que realmente é um sistema distribuído com processamento paralelo, dar um exemplo de aplicação e fazer uma demonstração com php + docker.

Diana Arnos

November 11, 2017
Tweet

More Decks by Diana Arnos

Other Decks in Programming

Transcript

  1. Who am I? Engenheira de Software @ Birdie Evangelista @

    PHPWomen Entusiasta de Segurança da Informação Vocalista de Heavy Metal
  2. SERVIDOR SERVIDOR SERVIDOR APLICAÇÃO O processamento da tarefa é distribuído

    em paralelo entre máquinas diferentes Solicita tarefa X X parte 1 X parte 2 X parte 3
  3. ARQUIVO Exemplo ARQUIVO PT. 1 ARQUIVO PT. 2 ARQUIVO PT.

    3 MÁQUINA 1 MÁQUINA 2 MÁQUINA 3 ARQUIVO PT. 1 ARQUIVO PT. 2 ARQUIVO PT. 3
  4. 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"; } }
  5. 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(); }
  6. 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.
  7. 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…
  8. Distribuindo o Processamento NO EXEMPLO DO ARQUIVO, UM 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();
  9. 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->scrappersAddress as $scrapper) { //código $this->result = stream_get_contents($client); } fclose($client); } }
  10. Distribuindo o Processamento - O CLIENT QUE FAZ A REQUISIÇÃO

    class Client { //código private function sendFilePiecesToWorkers($xml) { //código foreach ($this->scrappersAddress 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); } } }