Bonjour,
Merci à vous de vous pencher sur mes problèmes :-)
Problèmes
- mon client JS reçoit des notifications du serveur SSE même si ce dernier n'a rien à envoyer
- pourquoi les timestamp fonctionnent en $_SESSION et pas en $GLOBALS ?
Client side (JS)
Le client JS s'abonne à un serveur SSE et traite ses messages :
Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 function serverPushOk() { // Le client JS s'abonne au serveur SSE en donnant son ID et le code de son PROFILE _sseSource=new EventSource("sseServer.php?cmd=9&userId="+_$store.sysGet("userId")+"&userProfile="+_$store.sysGet("userProfile")); // Traitement d'un message SSE en provenance du server _sseSource.onmessage=function(event) { // Ici, on reçoit la liste des tables à mettre à jour // Elles le seront à la prochaine connexion dont on profitera pour envoyer les mises à jour à faire dans les tables du serveur ...code... }; }
Server side (PHP)
Problème 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <?php // 1. on interroge la base de données pour avoir le timestamp de chaque table ...code... session_start(); // 2. si $_SESSION de la table n'existe pas ou que le timestamp des bases de données est plus récent que celui de $_SESSION de la table, on ajoute le nom de la table à $update ...code... header("Access-Control-Allow-Origin: *"); header("Content-Type: text/event-stream"); header('Cache-Control: no-cache'); if($update!='') { echo 'data: '.$update."\n\n"; } session_write_close(); sleep(20); ?>
Le client JS reçoit un event toutes les 20 secondes = sleep(20) même s'il n'y a aucune mise à jour de tables. Il ne traite pas puisque qu'il n'y a pas de event.message mais cela consomme-t-il de la data pour le client ?
Si je déplace les header() dans le bloc if($update!=''), le script ne fonctionne plus
Problème 2
Le client JS fait périodiquement des appels Ajax pour mettre à jour des tables sur le serveur. Mon idée était de mettre le dernier timestamp d'une table modifiée en $GLOBALS pour éviter une requête base de données pour récupérer les timestamp.
C'est manifestement une idée à la c*n puisque cela ne fonctionne pas (mais c'est ok en $_SESSION). Je suis sur un serveur mutualisé, il se peut que cela apporte un élément de réponse.
Merci de votre attention et de vos éventuels retours.
Partager