Gabriel Couto, CTO e Founder da R3C, falou sobre 'React e Ratchet, async e websockets com PHP' no iMasters PHP Experience 2015.
O iMasters PHP Experience 2015 aconteceu dia 25 de Abril de 2015, no Hotel Renaissance em São Paulo-SP - http://phpexperience.imasters.com.br/
10. //Vou querer X usuários que encaixam nessa busca,
//batata grande e uma coca-cola
$usuarios = Usuarios::where('nome', $q)->get();
//Processa a resposta
$usuarios = $this->processarResposta($usuarios);
//Vai que é tua View!
return view('resultado', ['usuarios' => $usuarios]);
12. $usuarios = Usuarios::where('nome', $q)->get();
//Só será executado daqui para frente após
//a resposta do banco de dados (IO) chegar
$usuarios = $this->processarResposta($usuarios);
//Aqui após um processo intensivo de CPU
return view('resultado', ['usuarios' => $usuarios]);
21. O que um fork faz?
Cria novo processo, do zero! (0)
Cria um clone e copia a memória (0)
Cria um clone e usa a mesma memória (0)
22. $pid = pcntl_fork();
if ($pid == -1) {
die('could not fork =(');
} else if ($pid) {
// I'm your father!
DB::reconnect('mysql');
$users = $this->getUsers($totalUsers / 2, 0);
//Aguarda o processo filho terminar
pcntl_wait($status);
//Faz um merge do que o processo pai e filho processaram
//Os dados do processo filho estão no cache
$users = array_merge($users, Cache::pull($cacheKey));
}
23. } else {
// we are the child
DB::reconnect('mysql');
$users = $this->getUsers($totalUsers / 2, $totalUsers / 2);
//Armazena os usuários processados no cache
Cache::forever($cacheKey, $users);
die();
}
30. //cria o main loop
$loop = ReactEventLoopFactory::create();
//cria a conexão com o MySQL
$connection = new ReactMySQLConnection($loop, array(
'dbname' => $_ENV['DB_DATABASE'],
'user' => $_ENV['DB_USERNAME'],
'passwd' => $_ENV['DB_PASSWORD'],
));
$connection->connect(function () {});
31. $connection->query($query, function ($command, $conn) use ($loop) {
if ($command->hasError()) {
$error = $command->getError();
} else {
$results = $command->resultRows;
$this->users = array_merge($this->users, $this->processUsers($results));
$this->queries--;
if ($this->queries == 0) {
$loop->stop();
}
}
});
44. RFC 6455 DEZEMBRO DE 2011
Em 12 de Setembro de 2011 o Google Chrome 15 já implementava
The WebSocket Protocol enables two-way communication between a
client running untrusted code in a controlled environment to a remote
host that has opted-in to communications from that code.
47. VANTAGEM DE USAR WEBSOCKETS:
O servidor websocket pode ficar na mesma porta que o HTTP padrão, ele
usa campos do cabeçalho HTTP distintos
Suporta um servidor rodando múltiplos domínios
Suporta proxies HTTP
Só envia cabeçalhos HTTP no ato da conexão, depois é dado puro (em
UTF-8 ou binário)