Creare una chat in tempo reale con CodeIgniter e WebSocket: guida pratica
Una guida pratica per costruire una chat in tempo reale con CodeIgniter 4 e la libreria PHP Ratchet, capendo architettura, server WebSocket e collegamento al frontend.
Se avete mai usato una chat online — da WhatsApp Web a una live chat di assistenza — avrete notato che i messaggi appaiono all'istante, senza bisogno di ricaricare la pagina. Questo è possibile grazie ai WebSocket, una tecnologia che permette al browser e al server di scambiarsi dati in tempo reale, mantenendo aperta una connessione continua invece di aprirne una nuova per ogni richiesta come avviene con il normale protocollo HTTP.
In questa guida vedremo come costruire una semplice chat in tempo reale usando CodeIgniter, un framework PHP leggero e molto diffuso tra chi sviluppa applicazioni web in Italia, abbinato a una libreria PHP per la gestione dei WebSocket. L'obiettivo è capire l'architettura e i passaggi fondamentali, così da poter poi personalizzare il progetto secondo le proprie esigenze.
Perché HTTP non basta per una chat
Il protocollo HTTP, quello che il browser usa per caricare le pagine web, funziona a richieste: il client (il browser) chiede qualcosa al server, il server risponde, e la connessione si chiude. Per una chat questo approccio sarebbe scomodo: il browser dovrebbe continuare a chiedere "ci sono messaggi nuovi?" ogni pochi secondi (una tecnica chiamata polling), con inevitabile spreco di risorse e ritardi percepibili.
I WebSocket risolvono il problema aprendo un canale di comunicazione bidirezionale che resta attivo: una volta stabilita la connessione, sia il server che il browser possono inviare messaggi in qualsiasi momento, senza dover rifare la richiesta da capo. È lo stesso principio usato da app di messaggistica, notifiche push nei pannelli di amministrazione e giochi multiplayer nel browser.
L'architettura: due processi distinti
Un dettaglio importante da capire prima di iniziare: CodeIgniter, come la maggior parte dei framework PHP tradizionali, è pensato per gestire richieste HTTP "classiche" tramite un server web come Apache o Nginx con PHP-FPM. Questo tipo di PHP non è adatto a mantenere aperte migliaia di connessioni persistenti, che è invece esattamente ciò che serve a un server WebSocket.
La soluzione più comune, e quella che vedremo qui, è separare i due compiti:
- L'applicazione CodeIgniter continua a occuparsi di tutto il resto: pagine, autenticazione, salvataggio della cronologia dei messaggi su database, API REST.
- Un processo PHP separato, lanciato da riga di comando e sempre in esecuzione, gestisce esclusivamente le connessioni WebSocket usando una libreria dedicata (nel nostro caso Ratchet, una delle librerie PHP più usate per questo scopo).
I due processi comunicano tra loro quando serve (ad esempio per salvare un messaggio nel database), ma restano indipendenti: se il server WebSocket va in riavvio, il sito principale continua a funzionare normalmente.
Prerequisiti
- PHP 8.2 o superiore: è il requisito minimo delle versioni recenti di CodeIgniter 4 (la 4.7.4, l'ultima disponibile al momento di scrivere, è compatibile anche con PHP 8.5).
- Composer, il gestore di dipendenze PHP, per installare CodeIgniter e le librerie necessarie.
- Un progetto CodeIgniter 4 già avviato (si crea con
composer create-project codeigniter4/appstarter nome-progetto). - L'estensione PHP
socketsattiva, necessaria per far funzionare il server WebSocket.
Passo 1: installare la libreria WebSocket
Dentro la cartella del progetto CodeIgniter, installiamo Ratchet tramite Composer:
composer require cboden/ratchet
Ratchet è una libreria che implementa il protocollo WebSocket in PHP sfruttando ReactPHP, un framework per la programmazione asincrona: permette cioè al nostro script PHP di gestire molte connessioni contemporaneamente senza bloccarsi in attesa di ciascuna.
Passo 2: scrivere la logica della chat
Creiamo una classe che implementa l'interfaccia MessageComponentInterface di Ratchet. Questa classe definisce cosa succede quando un utente si connette, invia un messaggio o si disconnette. Un esempio semplificato, da salvare ad esempio in app/Libraries/ChatServer.php:
class ChatServer implements MessageComponentInterface {
protected $clients;
public function __construct() { $this->clients = new \SplObjectStorage; }
public function onOpen($conn) { $this->clients->attach($conn); }
public function onMessage($from, $msg) {
foreach ($this->clients as $client) {
if ($from !== $client) { $client->send($msg); }
}
}
public function onClose($conn) { $this->clients->detach($conn); }
public function onError($conn, $e) { $conn->close(); }
}
In pratica: quando arriva un messaggio da un utente (onMessage), lo rilanciamo a tutti gli altri utenti collegati tranne chi lo ha inviato. È la logica base di una chat di gruppo; da qui si possono aggiungere stanze separate, nomi utente, messaggi privati e salvataggio su database.
Passo 3: avviare il server WebSocket
Serve un piccolo script da lanciare da terminale, separato dal normale flusso di CodeIgniter, ad esempio chat_server.php nella radice del progetto:
$server = IoServer::factory(new HttpServer(new WsServer(new ChatServer())), 8080);
$server->run();
Avviandolo con php chat_server.php, il server resterà in ascolto sulla porta 8080, pronto ad accettare connessioni WebSocket. In un ambiente di produzione questo script va mantenuto attivo con uno strumento come Supervisor, che lo riavvia automaticamente in caso di crash, e va messo dietro un reverse proxy (Nginx o Apache) che gestisca il certificato SSL, così da esporre la connessione sicura wss:// invece del semplice ws://.
Passo 4: collegare il frontend
Nella view CodeIgniter della pagina di chat basta qualche riga di JavaScript nativo per collegarsi al server WebSocket, senza bisogno di librerie esterne:
const socket = new WebSocket('wss://tuosito.it:8080');
socket.onmessage = (event) => { /* mostra il messaggio ricevuto nella pagina */ };
document.getElementById('invia').onclick = () => { socket.send(testoMessaggio); };
Da qui si può arricchire l'interfaccia con un framework CSS come Bootstrap (molto usato insieme a CodeIgniter) per rendere la chat più gradevole, oppure integrare l'autenticazione degli utenti già gestita dall'applicazione CodeIgniter, passando un token al momento della connessione per verificare chi sta scrivendo.
Un'alternativa pronta all'uso
Chi preferisce non scrivere da zero il server WebSocket può valutare pacchetti Composer pensati apposta per integrarsi con i comandi spark di CodeIgniter 4, come takielias/codeigniter4-websocket, che fornisce una struttura già pronta con callback per autenticazione, stanze e timer, avviabile con un comando dedicato invece di uno script separato. È utile per prototipare rapidamente, pur restando basato sulla stessa libreria Ratchet descritta sopra.
Conclusione
Aggiungere una chat in tempo reale a un progetto CodeIgniter non richiede di abbandonare il framework: significa semplicemente affiancargli un piccolo processo PHP dedicato, basato su una libreria come Ratchet, che si occupa solo della parte "sempre connessa". Una volta compreso questo schema — applicazione classica da un lato, server WebSocket persistente dall'altro — è possibile estendere la logica a notifiche live, dashboard aggiornate in automatico o qualsiasi altra funzione che richieda comunicazione istantanea tra server e browser.
Fonti ufficiali
Share
What's Your Reaction?
Like
0
Cancella like
0
Amore
0
Buffo
0
arrabbiato
0
Sad
0
Wow
0