Matheo Bonucia
95d869bcf7
|
6 months ago | |
---|---|---|
.vscode | 6 months ago | |
README.md | 6 months ago | |
index.html | 6 months ago | |
server.php | 6 months ago |
README.md
Introdução
O PHP-SWOOLE é uma extensão do PHP que tem como objetivo estar possibilitando o uso de servidores WebSocket. Isso parte do objetivo de estabelecer uma comunicação que tem de ficar sempre aberta e recebendo informações para exibir ao usuário em uma tela estática front-end. O php-swoole pode ser aplicado em várias áreas da Simples IP, visto que, a base das aplicações também é o php.
Instalação
Para instalação, você pode dar um pull de uma imagem do Docker e executar ela. O comando para dar o pull é:
docker pull phpswoole/swoole
Após o download, você pode verificar se a imagem foi baixada corretamente listando as imagens disponíveis localmente usando o comando:
docker images
Agora que você tem a imagem phpswoole/swoole
baixada, pode executar um contêiner a partir dela usando o comando docker run
. Por exemplo, para iniciar um contêiner interativo a partir dessa imagem, você pode usar:
docker run -it --rm phpswoole/swoole /bin/bash
Criando os exemples necessários
Socket
Para estar fazendo os testes e implementando posteriormente, crie, caso ainda não tenha criado, o arquivo do servidor websocket com o nome server.php e defina sua porta para estar ouvindo os listeners, importe as bibliotecas necessárias do Swoole e outras funções necessárias para deixar o servidor rodando na porta escolhida, siga o exemplo abaixo:
<?php
use Swoole\WebSocket\Server;
use Swoole\WebSocket\Frame;
$server = new Server('0.0.0.0', 9501);
$server->on('message', function (Server $server, Frame $mensagem) {
$conexoes = $server->connections;
$origem = $mensagem->fd;
foreach ($conexoes as $conexao) {
if($conexao === $origem) continue;
$server->push($conexao, json_encode(['type' => 'chat', 'text' => $mensagem->data])
);
}
});
$server->start();
Neste exemplo estamos usando a porta 9501 e dizendo que caso o servidor conectado seja o mesmo que o servidor de origem da mensagem, deve-se ignorar o texto para não duplicar as mensagens.
Client
Para colocar em prática, devemos estar conectando esse client ao socket, portanto, colocamos listeners para serem emitidos ao servidor ao mesmo tempo que instanciamos o servidor WebSocket no lado do cliente, abaixo trago um exemplo básico para implementar com o uso de JavaScript e tags HTML básicas:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Websocket - Cliente</title>
</head>
<body>
<output></output>
<input type="text">
<script>
const ws = new WebSocket('ws://127.0.0.1:9501/');
const input = document.querySelector('input');
const output = document.querySelector('output');
ws.addEventListener('open', console.log);
ws.addEventListener('message', console.log);
ws.addEventListener('message', message => {
const dados = JSON.parse(message.data);
if(dados.type === 'chat') {
output.append('Outro: ' + dados.text, document.createElement('br'));
}
});
input.addEventListener('keypress', e => {
if(e.code === 'Enter') {
const valor = input.value;
output.append('Eu: ' + valor, document.createElement('br'));
ws.send(valor);
input.value = '';
}
})
</script>
</body>
</html>
Uso
Certifique-se de ao iniciar o Docker, executar o comando:
docker run --rm -p 9501:9501 -v $(pwd):/app -w /app phpswoole/swoole php server.php
Neste caso, estaremos utilizando a porta 9501 para o contêiner e estaremos iniciando ele a partir da pasta atual e criando o /app. A imagem tem o nome de phpswoole/swoole e estamos dizendo que iremos executar o comando:
php server.php
Ou seja, iremos executar o script em PHP que contém os códigos necessários para iniciar o servidor WebSocket. Assim, os arquivos .html e .php que criamos como exemplos anteriormente, precisam estar dentro da pasta /app. Certifique-se também de que ao abrir o seu editor de código, por exemplo o Vscode, ele esteja no diretório correto que seria dentro da pasta /app.
Para fazer os testes e estar utilizando da aplicação, você pode estar abrindo duas janelas do arquivo HTML no browser e realizar o envio de mensagens um para o outro.