Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

WebSocket server con PHP

Imparare ad utilizzare Ratchet, una delle principali librerie per realizzare WebSocket server in linguaggio PHP.
Imparare ad utilizzare Ratchet, una delle principali librerie per realizzare WebSocket server in linguaggio PHP.
Link copiato negli appunti

Dopo avere visto come realizzare un WebSocket server in alcuni dei linguaggi server moderni più innovativi, in questa lezione ci concentreremo su una delle soluzioni "storiche" della programmazione web, e su cui ancora oggi si basa una grossa fetta di Internet: PHP.

Come abbiamo già visto per gli altri linguaggi, anche su PHP sono disponibili diverse librerie in grado di implementare il protocollo di comunicazione che sta alla base delle WebSocket. Quella che approfondiremo nel seguito è Ratchet, ed è una delle opzioni più apprezzate dagli sviluppatori PHP in questo ambito.

Possiamo iniziare subito con l'installazione di Ratchet, che può essere portata a termine utilizzando Composer (che si occuperà per noi di gestire tutte le dipendenze):

php ~/composer.phar require cboden/ratchet && php ~/composer.phar install

Una volta completata l'installazione (per maggiori dettagli è comunque possibile consultare il sito ufficiale di Ratchet), non resta che capire come utilizzare le potenzialità di questa libreria.

Iniziamo a dare uno sguardo al codice seguente:

namespace Test;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class MyWebSocketServer implements MessageComponentInterface {
  public function onOpen(ConnectionInterface $conn) {
      // Metodo eseguito all'apertura della connessione
  }
  public function onMessage(ConnectionInterface $from, $msg) {
      // Metodo eseguito alla ricezione di un messaggio
      // La variabile $msg rappresenta il messaggio (in forma di stringa)
  }
  public function onClose(ConnectionInterface $conn) {
      // Metodo eseguito alla chiusura della connessione
  }
  public function onError(ConnectionInterface $conn, \Exception $e) {
      // Metodo eseguito in caso di errore
  }
}

Quella appena presentata è la struttura di base di una classe che consente di implementare un WebSocket server. Come già visto con Java, Python e C#, anche in questo caso è facile paragonare la sintassi a quella di un client JavaScript, il che rende l'utilizzo di Ratchler abbastanza intuitivo. Una volta aperta la connessione, sarà invocato il metodo onOpen, così come onClose sarà eseguito alla chiusura della connessione. Tutte le volte che sarà ricevuto un messaggio, sarà invece invocato il metodo onMessage, il cui parametro $msg non è altro che il messaggio ricevuto. Analizzando il contenuto di $msg sarà quindi possibile scrivere del codice che dipenda proprio dal messaggio.

Uno dei principali vantaggi delle WebSocket è la possibilità di inviare messaggi dal server al client. Per farlo in PHP con Ratchler, abbiamo bisogno prima bisogno di salvare gli oggetti che rappresentano i client, in modo da porterli utilizzare per l'invio dei messaggi. Per farlo, sfruttiamo i metodi onOpen ed onClose e modifichiamo come segue la classe precedente:

class MyWebSocketServer implements MessageComponentInterface {
  protected $clients;
  public function __construct() {
      $this--->clients = new \SplObjectStorage;
  }
  public function onOpen(ConnectionInterface $conn) {
      $this->clients->attach($conn);
  }
  public function onMessage(ConnectionInterface $from, $msg) {
      // ... //
  }
  public function onClose(ConnectionInterface $conn) {
      $this->clients->detach($conn);
  }
  public function onError(ConnectionInterface $conn, \Exception $e) {
      // ... //
  }
}

Come si vede, abbiamo aggiunto un membro $clients alla nostra classe, che ci consente di memorizzare tutti i client ogni volta che il metodo onOpen è invocato, mentre l'esecuzione del metodo onClose (che indica la chiusura della connessione) provvederà ad aggiornare $clients rimuovendo i client disconnessi. Così facendo avremo sempre a disposizione un oggetto che contiene i riferimenti a tutti i client connessi, e potremo utilizzarlo per inviare messaggi ad ognuno di essi con il codice seguente:

foreach ($this->clients as $client) {
              $client->send("Messaggio d'esempio");
      }

Per finire, non resta che capire come avviare il server. Per farlo, abbiamo bisogno di inizializzare un oggetto HttpServer, che accetta come parametro un'istanza della classe WsServer, implementata a sua volta passando come argomento un oggetto della classe MyWebSocketServer appena discussa:

use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Test\MyWebSocketServer;
    $server = IoServer::factory(
      new HttpServer(
          new WsServer(
              new MyWebSocketServer()
          )
      ),
      8080 // porta
  );
  $server--->run();

Il risultato sarà un WebSocket server scritto in PHP e pronto per l'uso.

Ti consigliamo anche