Como Criar um Chat em Tempo Real com PHP e WebSockets

Postado Por:

Categoria:

Postado em:

Como Criar um Chat em Tempo Real com PHP e WebSockets

Desenvolva um sistema de chat dinâmico com PHP e WebSockets, utilizando HTML, CSS e JavaScript para uma experiência de usuário em tempo real.

O WebSocket é uma tecnologia que permite uma conexão persistente entre o servidor e o cliente, possibilitando a troca de dados em tempo real. Ao contrário do AJAX, que requer múltiplas requisições HTTP, o WebSocket mantém uma conexão aberta, tornando-o ideal para aplicativos de chat.

Requisitos

  • Servidor local com suporte a PHP (XAMPP, WAMP, MAMP, ou outro)
  • Composer para instalar bibliotecas PHP
  • Conhecimento básico de PHP, HTML, CSS e JavaScript

Passo 1: Preparando o Projeto

Crie a estrutura do projeto com os seguintes arquivos:

.porto-u-8959.porto-u-heading{text-align:left}
/chat
  - index.php
  - chat.css
  - chat.js
  - server.php
  - composer.json

Passo 2: Instalando o Ratchet (Biblioteca de WebSockets para PHP)

Usaremos o Ratchet, uma biblioteca para WebSockets em PHP. Primeiramente, instale o Composer e, dentro da pasta do projeto, execute:

.porto-u-4096.porto-u-heading{text-align:left}
composer require cboden/ratchet

Isso instalará o Ratchet e suas dependências.

Passo 3: Criando o Servidor de WebSockets com PHP

No arquivo server.php, vamos configurar o servidor WebSocket usando Ratchet:

.porto-u-2253.porto-u-heading{text-align:left}
<?php

require __DIR__ . '/vendor/autoload.php';

use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class Chat implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new \SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        // Adiciona o cliente conectado
        $this->clients->attach($conn);
        echo "Nova conexão: {$conn->resourceId}\n";
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        // Envia a mensagem para todos os clientes conectados
        foreach ($this->clients as $client) {
            if ($from !== $client) {
                $client->send($msg);
            }
        }
    }

    public function onClose(ConnectionInterface $conn) {
        // Remove o cliente desconectado
        $this->clients->detach($conn);
        echo "Conexão {$conn->resourceId} fechada\n";
    }

    public function onError(ConnectionInterface $conn, \Exception $e) {
        echo "Erro: {$e->getMessage()}\n";
        $conn->close();
    }
}

// Inicia o servidor WebSocket
$app = new Ratchet\App('localhost', 8080, '0.0.0.0');
$app->route('/chat', new Chat, ['*']);
$app->run();

Esse servidor WebSocket aceita conexões de clientes, recebe mensagens e as retransmite para todos os outros clientes conectados.

Passo 4: Criando a Interface do Chat (HTML)

No arquivo index.php, vamos criar a interface do chat onde os usuários podem interagir:

.porto-u-6048.porto-u-heading{text-align:left}
<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Chat em Tempo Real</title>
    <link rel="stylesheet" href="chat.css">
</head>
<body>
    <div class="chat-container">
        <div id="chat-box"></div>
        <form id="chat-form">
            <input type="text" id="message" placeholder="Digite sua mensagem..." required>
            <button type="submit">Enviar</button>
        </form>
    </div>

    <script src="chat.js"></script>
</body>
</html>

Passo 5: Estilizando a Interface (CSS)

No arquivo chat.css, estilizamos a interface para que fique moderna e amigável:

.porto-u-5485.porto-u-heading{text-align:left}
body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f4;
    margin: 0;
    padding: 0;
}

.chat-container {
    max-width: 500px;
    margin: 20px auto;
    padding: 10px;
    background: #fff;
    box-shadow: 0 0 10px rgba(0,0,0,0.1);
}

#chat-box {
    height: 300px;
    border: 1px solid #ccc;
    padding: 10px;
    overflow-y: scroll;
    background: #fafafa;
    margin-bottom: 10px;
}

#chat-form {
    display: flex;
}

#message {
    flex: 1;
    padding: 10px;
    border: 1px solid #ccc;
}

button {
    padding: 10px;
    background-color: #5cb85c;
    color: #fff;
    border: none;
    cursor: pointer;
}

Passo 6: Comunicação com o Servidor (JavaScript)

No arquivo chat.js, vamos configurar a comunicação com o servidor WebSocket:

.porto-u-9327.porto-u-heading{text-align:left}
let conn = new WebSocket('ws://localhost:8080/chat');
const chatBox = document.getElementById('chat-box');
const form = document.getElementById('chat-form');
const messageInput = document.getElementById('message');

// Receber mensagens do servidor
conn.onmessage = function(e) {
    let message = document.createElement('div');
    message.textContent = e.data;
    chatBox.appendChild(message);
    chatBox.scrollTop = chatBox.scrollHeight; // Scroll automático
};

// Enviar mensagens para o servidor
form.addEventListener('submit', function(e) {
    e.preventDefault();
    let message = messageInput.value;
    conn.send(message);
    messageInput.value = '';
});

Passo 7: Executando o Servidor WebSocket

Agora, vamos rodar o servidor WebSocket. No terminal, execute:

.porto-u-2555.porto-u-heading{text-align:left}
php server.php

O servidor WebSocket estará escutando na porta 8080.

Passo 8: Testando o Chat

Abra o arquivo index.php no navegador e teste o envio de mensagens entre várias janelas abertas. Quando uma mensagem é enviada, todas as janelas conectadas recebem a mensagem instantaneamente.

Conclusão

Neste tutorial, você aprendeu como criar um chat em tempo real usando WebSockets com PHP e Ratchet. Com o WebSocket, conseguimos implementar uma comunicação eficiente e dinâmica, ideal para sistemas que exigem troca de informações rápidas, como chats, sistemas de notificação e jogos.

.porto-u-6984.porto-u-heading{text-align:left}

Deixe seu comentário

Posts RELACIONADOS