Websocket et PHP
Posté : 24 août 2011, 18:19
Depuis quelque temps je fais des tests avec les Websocket, et je suis plutôt convaincu par le systèmes, pour ceux qui ne le savent pas les Websocket c'est un peu comme de l'AJAX mais en flux continu, ceux qui veut dire que vous n'avez pas à rafraichir la page ou faire des requêtes AJAX tout les X temps pour avoir des informations.
L’inconvénient ici est que l'on a besoin d'un serveur Websocket, pas de panique il en existe des gratuits par exemple Nodester : qui est simplement un hébergeur Node.js
On peux donc creer en quelques lignes (5) un serveur Websocket
Et que vient faire PHP la dedans ?
Le Websocket c'est plutôt entre le client web et le serveur, et bien ici PHP va servir lui aussi de client grâce à la classe WebSocket
(attention c'est très expérimental), et socket.io-client pour le client
L’intérêt de cette classe est de fournir des informations que seul un serveur pourrait fournir, comme par exemple un traitement terminer.
Exemple :
serveur.php
Pour le moment je laisse le serveur tel quel pour les tests il changera a l'avenir, Nodester est gratuit si vous voulez faire vos tests
L’inconvénient ici est que l'on a besoin d'un serveur Websocket, pas de panique il en existe des gratuits par exemple Nodester : qui est simplement un hébergeur Node.js
On peux donc creer en quelques lignes (5) un serveur Websocket
Et que vient faire PHP la dedans ?
Le Websocket c'est plutôt entre le client web et le serveur, et bien ici PHP va servir lui aussi de client grâce à la classe WebSocket
L’intérêt de cette classe est de fournir des informations que seul un serveur pourrait fournir, comme par exemple un traitement terminer.
Exemple :
serveur.php
set_include_path('../Stdlib/library' . PATH_SEPARATOR . get_include_path());
spl_autoload_register();
$handcheck = file_get_contents('http://stealth35.nodester.com/socket.io/1');
list($sid) = explode(':', $handcheck);
$text = empty($_GET['m']) ? 'server' : $_GET['m'];
$socket = new Stdlib\WebSocket("ws://stealth35.nodester.com/socket.io/1/websocket/$sid");
$message = '5:::' . json_encode(array('name' => 'server', 'args' => array('message' => 'hello form ' . $text)));
$socket->send($message);
$socket->close();
client.html
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/scriptaculous.js"></script>
<script type="text/javascript" src="node_modules/socket.io-client/dist/socket.io.js"></script>
<div id="messages"></div>
<script type="text/javascript">
var socket = io.connect('http://stealth35.nodester.com');
socket.on('server', function(data) {
var p = new Element('p', { 'class': 'message'}).update(data.message);
$('messages').insert(p);
p.highlight();
});
</script>
server.js (juste pour info)
var express = require('express');
var io = require('socket.io');
var app = express.createServer()
, io = io.listen(app);
app.listen(8000);
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('server', function (data) {
socket.broadcast.emit('server', data);
});
});
A chaque fois que le client se lancera (rajouter ?m en paramètre si vous voulez), tout les navigateurs afficheront le nouveau message, et le must c'est que socket.io prend aussi en charge les navigateur ne supportant pas les websocket (via flash, ou AJAX)Pour le moment je laisse le serveur tel quel pour les tests il changera a l'avenir, Nodester est gratuit si vous voulez faire vos tests