Plan du site  
pixel
pixel

Articles - Étudiants SUPINFO

Elephant.io : Un client socket.io pour PHP !

Par Thomas ZUK Publié le 16/08/2015 à 16:24:35 Noter cet article:
(0 votes)
Avis favorable du comité de lecture

Dans un précédent article (dont voici le lien : https://www.supinfo.com/articles/single/88-communication-php-nodejs), je vous expliquais comment il était possible de faire communiquer des serveurs PHP et Node.js par l’intermédiaire de Redis. Cependant, comme vous l’aurez peut-être remarqué, cette solution nécessite un certain nombre d’installations et de configurations qu’il est parfois difficile d’appréhender dans un environnement de production déjà stabilisé.

C’est ici qu’intervient Elephant.io, une bibliothèque PHP qui va vous permettre d’envoyer des messages entre vos serveurs PHP et Node.js. L’avantage d’utiliser cette bibliothèque réside dans le fait qu’elle est légère et simple d’utilisation, malheureusement elle n’aura pas la possibilité de gérer des configurations plus complexes comme l’utilisation des « namespaces » ou des « rooms » de Socket.io par exemple. Donc, si vous cherchez à communiquer simplement entre vos deux serveurs Web, vous vous trouvez au bon endroit. Pour des cas d’utilisation plus complexes, vous pouvez vous référer à mon article précédent.

Prérequis :

  • Connaissances basiques en PHP

  • Connaissances basiques en Node.js (notamment Socket.io)

Implémentation

Avec Composer

Elephant.io fait l’objet d’un package Composer. Que vous ayez ou non l’habitude d’utiliser ce gestionnaire de package, je vous conseille vivement de l’installer car il va vous générer automatiquement un fichier « autoload.php » nécessaire pour simplifier l’utilisation d’Elephant.io. Si vous n’en avez pas encore, créez un fichier « composer.json » au niveau de la racine de votre projet puis rajoutez ceci :

{

"require": {

"wisembly/elephant.io": "~3.0"

}

}

Vous pouvez réaliser l’installation d’Elephant.io en vous rendant dans le dossier de votre projet depuis le « Terminal » ou un « Invite de commandes » grâce à la commande « cd » puis en entrant l’instruction suivante :

composer install

Un dossier « vendor » va alors être créé, il contiendra un fichier « autoload.php » que nous aurons besoin d’inclure à notre projet.

Pour pouvoir installer Composer sur votre machine, il existe plusieurs solutions qui sont décrites à l’adresse suivante :

Manuellement (non recommandé)

Il est aussi possible de télécharger directement les sources de la bibliothèque Elephant.io depuis l’adresse suivante : https://github.com/wisembly/elephant.io en cliquant sur le bouton « Download ZIP ».

Vous aurez ensuite le choix entre garder les sources telles qu’elles sont et les inclure directement à votre projet ou créer manuellement le fichier « autoload.php » correspondant. Pour ce dernier cas, vous pouvez, par exemple, utiliser la fonction suivante si votre projet respecte la norme PSR-0 (une convention de nommage pour vos classes et vos espaces de noms) pour générer le fichier en question :

function autoload($className) {

$className = ltrim($className, '\\');

$fileName = '';

$namespace = '';

if ($lastNsPos = strrpos($className, '\\')) {

$namespace = substr($className, 0, $lastNsPos);

$className = substr($className, $lastNsPos + 1);

$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;

}

$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; require $fileName;

}

spl_autoload_register('autoload');

Si vous souhaitez en savoir plus sur la façon de générer un « autoload » en PHP, je vous conseille de visiter les liens suivants :

Chargement des sources

Pour pouvoir utiliser Elephant.io, il vous suffit à présent d’inclure le fichier « autoload.php » directement dans votre code PHP en fournissant le lien de cette manière :

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

Si vous n’avez pas généré ce fichier, il vous suffit d’inclure directement dans votre code PHP un lien (grâce aux fonctions « include » ou « require ») vers chacun des fichiers présents dans le dossier « src » du projet Elephant.io.

Preuve du concept

Émettre un message depuis PHP

Ce cas d’utilisation est fonctionnel avec les versions 0.x et 1.x de Socket.io. Nous allons utiliser les « namespaces » (ou espaces de noms) suivants afin de rendre notre code plus lisible :

use ElephantIO\Client, ElephantIO\Engine\SocketIO\Version1X;

Ensuite, afin d’envoyer un message à votre serveur Node.js, vous pouvez utiliser les lignes de code suivantes :

$client = new Client(new Version1X('http://localhost:8080'));

$client ->initialize();

$client ->emit('emitPHP', ['message' => 'Message émis depuis PHP !']);

$client ->close();

Ce code va tout simplement commencer par instancier une nouvelle classe du client d’Elephant.IO prenant en paramètre l’adresse du serveur Node.js (qui dans mon cas sera exécuté en local sur le port 8080). Une fois la connexion établie grâce à la fonction « initialize », nous allons pouvoir utiliser la méthode « emit », très similaire à celle qui existe en Socket.io. Cette méthode va prendre en paramètre le nom du message (ici « emitPHP ») ainsi que son contenu (« Message émis depuis PHP ! »). Attention, le type de ce dernier doit obligatoirement être un tableau.

Pour ce tableau, j’ai utilisé la syntaxe qui n’existe que depuis la version 5.4 de PHP, mais il est évidemment que l’ancienne syntaxe est toujours valide :

$client ->emit('emitPHP', array('message' => 'Message émis depuis PHP !'));

Ensuite, nous fermons la connexion grâce à la fonction « close ».

Côté Node.js, il ne nous reste plus qu’à démarrer notre serveur sur le même port que celui que nous avions précisé précédemment (8080 dans mon cas). Rajoutez enfin un « listener » (à l’aide de la fonction « on() » de socket) sur le message « emitPHP » afin d’assurer la réception. Vous pouvez vous inspirer de ce code très basique :

var server = require('http').createServer(),

io = require('socket.io')(server),

port = 8080;

io.on('connection', function (socket){

console.log('Socket.io est connecté');

socket.on('emitPHP', function (data) {

console.log('Reception du message : ' + data.message);

});

socket.on('disconnect', function () {

console.log('Socket.io déconnecté');

});

});

server.listen(port);

Ainsi, dès que nous allons accéder à notre page PHP, nous allons envoyer un message depuis PHP à notre serveur Node.js. Voici ce que va m’afficher la console où j’ai démarré mon serveur Node.js :

Recevoir un message depuis PHP

Vous allez pouvoir réaliser l’envoi d’un message depuis votre client vers votre serveur PHP. Ce cas d’utilisation n’est fonctionnel qu’avec les versions 1.x de Socket.io.

Elephant.io met à disposition une fonction qui va vous permettre de récupérer les derniers messages qui ont transité entre les serveurs. Il s’agit de « read », elle ne prend aucun paramètre. Voici la portion de code qui va vous permettre de l’utiliser (en supposant que vous employiez les mêmes espaces de noms que précédemment) :

$client = new Client(new Version1X('http://localhost:8080'));

$client->initialize();

$dataReceived = $client->read();

$client->close();

echo $dataReceived;

Le code client qui va s’exécuter sur votre page HTML est identique à ce que vous faisiez quand vous utilisiez le module Socket.io sans PHP. Il vous suffit simplement de vous connecter à votre serveur Node.js puis d’émettre un message :

<script src="http://localhost:8080/socket.io/socket.io.js"></script>

<script>

var socket = io('http://localhost:8080');

socket.emit('emitClient', {

message: 'Message émis depuis le client !'

});

</script>

Accédez à votre page HTML puis exécuter votre code PHP pour voir apparaître le message dans la variable « $dataReceived ». Il vous sera donc possible d’envoyer des messages depuis votre serveur Node.js à PHP en utilisant votre page cliente en tant que passerelle intermédiaire.

Il est important de noter que ce cas d’utilisation n’est pas le plus courant et n’est présent ici que dans le seul but de pouvoir tester rapidement son bon fonctionnement. En effet, l’écoute se faisant uniquement sur la durée de vie du thread PHP, vous serez amené, dans un cas d’utilisation concret, à activer cette lecture à l’aide d’un script exécuté avec PHP et non pas pour un site Web classique.

Conclusion

Nous avons ainsi étudié comment implémenter et utiliser la bibliothèque PHP Elephant.io afin de faire communiquer nos serveurs Web de langages différents. Cela va ainsi vous permettre, par exemple, de dynamiser une application Web PHP préexistante avec les réponses en temps réel fournies par Socket.io. Dans ce cas, vous conserveriez votre application PHP gérant les données et la sécurité tout en accordant une meilleure expérience utilisateur grâce à des temps d’attente réduits voire supprimés. Elephant.io étant très simple d’utilisation et d’implémentation, vous serez aussi en mesure de réaliser sans trop de difficultés une application Backend entièrement à l’aide d’APIs REST.

Si vous souhaitez aller plus loin dans l’utilisation de cette bibliothèque, je vous conseille de regarder les différents fichiers de code présents dans le projet Elephant.io, au niveau de ce chemin : « /example/socket.io/1.x ». Vous y trouverez deux dossiers : « emitter » et « receiver » qui contiennent des fichiers d’exemple.

Il existe aussi une autre bibliothèque intitulée « socket.io-php-emitter » permettant uniquement d’envoyer des messages depuis PHP vers Node.js en utilisant un « TinyRedisClient » par défaut. Si jamais cela vous intéresse, voici le lien : https://github.com/rase-/socket.io-php-emitter.

A propos de SUPINFO | Contacts & adresses | Enseigner à SUPINFO | Presse | Conditions d'utilisation & Copyright | Respect de la vie privée | Investir
Logo de la société Cisco, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société IBM, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sun-Oracle, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Apple, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sybase, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Novell, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Intel, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Accenture, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société SAP, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Prometric, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Toeic, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo du IT Academy Program par Microsoft, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management

SUPINFO International University
Ecole d'Informatique - IT School
École Supérieure d'Informatique de Paris, leader en France
La Grande Ecole de l'informatique, du numérique et du management
Fondée en 1965, reconnue par l'État. Titre Bac+5 certifié au niveau I.
SUPINFO International University is globally operated by EDUCINVEST Belgium - Avenue Louise, 534 - 1050 Brussels