Skip to content
Quentin01 edited this page Apr 11, 2012 · 8 revisions

Présentation

PHPPush est un projet réalisé par Quentin Buathier, alias Quentin01, c'est un pseudo système de push utilisant Ajax, permettant ainsi à des personnes ne pouvant pas installer des choses côtés serveurs de pouvoir utiliser un système similaire aux websockets. Le système s'inspire fortement de Socket.IO au niveau de l'utilisation, il utilise donc des événements associés à des données qui transitent entre les différents serveur et le client.

Attention, cette version n'est pas encore finit, loin de là. Elle est donc stable mais peut être amené à être modifié de manière non rétrocompatible par la suite.

Installation

L'installation est très simple. Tout d'abord il vous faut télécharger le code source, seul le dossier lib/ est utile, le dossier test/ n'est qu'une démonstration du système présenté sous forme de t'chat fonctionnelle. Le dossier lib/ doit donc être copié dans le répertoire de votre projet.

Utilisation

Le serveur

Le code côté serveur doit inclure le fichier lib/server/PHPPush.php qui contient la classe Serveur a hérité. En effet, la création d'un serveur se résume à hériter la classe PHPPush contenu dans ce fichier et a y définir des méthodes se nommant d'une certaine façon. Pour intercepter l’événement nommé "connexion" par exemple, il faudra définir une méthode nommé "onConnexion". Donc vous l'aurez compris, "on" suivit du nom de l’événement commençant par une majuscule. Exemple :

<?php
require 'lib/server/PHPPush.php';

class Serveur extends PHPPush {
	protected function onConnexion($data) {
		// Ici le code exécute lors de la réception d'un événement "connexion"
	}
}

Bien sûr, la méthode prend un argument qui contient les données envoyés par le client. Un événement spéciale est spécifique à PHPPush, il se nomme 'timeout' et est exécute lorsque le client n'est plus connecté depuis X secondes ( temps données au constructeur de la classe ).

Après avoir créé notre classe il nous faut maintenant l’exécuter. Pour cela il faut l'instancier et appeler sa méthode nomme "launch", comme ceci :

<?php
require 'lib/server/PHPPush.php';

class Serveur extends PHPPush {
	protected function onConnexion($data) {
		// Ici le code exécute lors de la réception d'un événement "connexion"
	}
}

$serveur = new Serveur(50); // 50 est le temps de timeout, 30 par défaut
$serveur->launch();

La classe serveur comprend deux attributs utiles. "currentClient" qui contient une instance de Client() du client qui exécute actuellement la page et qui donc fait actuellement une requête, et "clients" qui est un array contenant les instances de tout les clients à part l'actuel, cette array ayant pour clés les ids des clients et pour valeurs les instances.

Pour envoyer un événement à partir du serveur à un / plusieurs clients il y a quatre façons de procéder. Pour envoyer un evenement à tous, il faut appeler la méthode emit(eventName, [data]) du serveur. Pour envoyer un évenement à tous les clients à part l'actuel il faut utiliser la méthode broadcast(eventName, [data]) du serveur. Donc par exemple :

<?php
require 'lib/server/PHPPush.php';

class Serveur extends PHPPush {
	protected function onConnexion($data) {
		$this->broadcast('newUser', $data->nick); // On envoit un évenement à tout les clients sauf l'actuel pour dire qu'un nouvelle utilisateur s'est connecté
	}
}

$serveur = new Serveur(50); // 50 est le temps de timeout, 30 par défaut
$serveur->launch();

Les deux autres façon se font en utilisant les instances des clients. Un client a aussi une méthode broadcast qui envoie un événement à tout les clients sauf lui et une méthode emit qui envoie un événement seulement à lui même.

Un objet client peut aussi se manipuler comme un array, cela permet de stocker des informations sur les différents clients qui sont ensuite accessible à chaque requête du serveur, par exemple dans notre cas, l'utilisateur se connecte, on veut donc lui donner un nom d'utilisateur.

<?php
require 'lib/server/PHPPush.php';

class Serveur extends PHPPush {
	protected function onConnexion($data) {
		$this->broadcast('newUser', $data->nick); // On envoit un évenement à tout les clients sauf l'actuel pour dire qu'un nouvelle utilisateur s'est connecté
		$this->currentClient['nick'] = $data->nick; // On donne un attribut 'nick' à notre client actuel qui sera accessible tout le temps
	}
}

$serveur = new Serveur(50); // 50 est le temps de timeout, 30 par défaut
$serveur->launch();

Le client

Passons maintenant au côté client, celui ci est aussi très simple de fonctionnement. Là encore il suffit de récupérer des événements et d'en envoyer. Il faut pour ça inclure le fichier lib/client/PHPPush.js qui contient une variable nommé PHPPush et qui contient plusieurs fonctions à utiliser.

La première à connaître est donc PHPPush.connect(linkServer, [rate]) qui se connecte à un serveur. Le paramètre 'rate' contient le nombre de millisecondes entre chaque requête Ajax pour récupérer les nouveaux événements lancés par le serveur. Il faut ensuite utiliser la fonction PHPPush.launch() pour lancer le client.

PHPPush.connect('server.php', 3000); // On se connecte à server.php qui est la page précédemment créé avec un taux de rafraîchissement de 3s
PHPPush.launch(); // On lance la connexion

Pour lancer un événement on procède comme côté serveur, mais seul la fonction PHPPush.emit(eventName, [data]) est utilisé puisqu'on envoie des informations qu'à un serveur et non à plusieurs clients.

PHPPush.connect("server.php", 3000); // On se connecte à server.php qui est la page précédemment créé avec un taux de rafraîchissement de 3s
PHPPush.launch(); // On lance la connexion

PHPPush.emit("connexion", {"nick" : "Anonyme"}); // On envoit un évenement de connexion avec un pseudo

Pour récupérer des évenements on donne tout simplement un callback à notre PHPPush avec le fonction PHPPush.on(eventName, callback) de cette façon :

PHPPush.on("newUser", function(nick) {
	alert("L'utilisateur " + nick + " vient de se connecter");
});

PHPPush.connect("server.php", 3000); // On se connecte à server.php qui est la page précédemment créé avec un taux de rafraîchissement de 3s
PHPPush.launch(); // On lance la connexion

PHPPush.emit("connexion", {"nick" : "Anonyme"}); // On envoit un évenement de connexion avec un pseudo

Comme vous pouvez le voir, en tant que donnée on récupère directement le nick vu que le serveur renvoi une chaîne de caractère. Si le serveur aurait renvoyé un objet ou un array on aurait reçu les données en tant qu'objet ou tableau.

Clone this wiki locally