IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Server Sent Events : ne retourner aucune donnée + $GLOBALS


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Juillet 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Juillet 2016
    Messages : 73
    Points : 116
    Points
    116
    Par défaut Server Sent Events : ne retourner aucune donnée + $GLOBALS
    Bonjour,

    Merci à vous de vous pencher sur mes problèmes :-)

    Problèmes
    1. mon client JS reçoit des notifications du serveur SSE même si ce dernier n'a rien à envoyer
    2. 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)
    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);
    ?>
    Problème 1
    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.
    C'est quand un homme voit un moustique posé sur un de ses testicules qu'il comprend que la violence ne peut pas résoudre tous les problèmes.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 690
    Points : 20 211
    Points
    20 211
    Par défaut
    Je ne répondrais pas pour le premier problème , le code fournis n'est pas suffisant.

    Pour le second problème effectivement utiliser les globales n'est pas une bonne idée.
    Déjà parce que utiliser des variables globales c'est le mal absolu et que ca doit être évité à tout prix. Et ensuite car contrairement aux variables de sessions elle ne survivent que pour la durer de ton script alors que les variables de sessions durent la durée ... de la session Donc a la fin de l'execution de ton script (timeout par exemple) tes globals disparaissent , pas les sessions.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Juillet 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Juillet 2016
    Messages : 73
    Points : 116
    Points
    116
    Par défaut Problème 2 : informations complémentaires
    Merci de cette cette réponse.

    Voici l'architecture de l'application qui va mieux (je l'espère) expliquer le contexte :

    Nom : ordino_sse.png
Affichages : 59
Taille : 65,4 Ko

    Mon idée (pourrie puisque ne fonctionnant pas) était que, puisque qu'un $_SESSION (sous ensemble de $GLOBALS) défini dans script A était visible dans script B, un $GLOBALS["xxx"] défini dans script A serait visible dans script B.

    Donc mon idée était :
    1. script A mémorise dans un $GLOBALS le timestamp des tables => sera donc visible par toutes les sessions de script B
    2. script B compare le timestamp $GLOBALS des tables aux timestamp $_SESSION pour décider s'il faut faire une mise à jour
    Images attachées Images attachées  
    C'est quand un homme voit un moustique posé sur un de ses testicules qu'il comprend que la violence ne peut pas résoudre tous les problèmes.

  4. #4
    Membre régulier
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Juillet 2016
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyste programmeur

    Informations forums :
    Inscription : Juillet 2016
    Messages : 73
    Points : 116
    Points
    116
    Par défaut Problème 1 : informations complémentaires
    Voisi le détail du script A de l'architecture :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?php
    	error_reporting(E_ALL);
    	ini_set("display_errors", "On");
     
    	define('_VERSION','1.0.5');
    	define('_PS_ADMIN_DIR','../../');
    	include(_PS_ADMIN_DIR.'config/config.inc.php');
     
    	{	session_start();
    		// *partA*
    		// On récupère les timestamp des tables de la base de données
    		// Les timestamp sont stockés dans une table car (voir mon problème 2 :-)
    		$req='SELECT * FROM `xxx.data` WHERE `xxx.data`.`varId`=1;';
    		$res=Db::getInstance()->executeS($req);
    		$stamps=[];
    		if ($res[0]['varData']!='')
    		{	$tmp=explode('|',$res[0]['varData']);
    			for($i=0;$i<count($tmp);$i++)
    			{	$data=explode('=',$tmp[$i]);
    				$stamps[$data[0]]=$data[1];
    			}
    		}
    		$update='';
    		// *partB*
    		// Si les timestamp de $_SESSION sont inexistant ou inférieurs aux timestamp de la base de donnée, on signifie une demande de mise à jour
    		foreach($stamps as $key=>$value)
    		{	if(!isset($_SESSION[$key]) || (($value-$_SESSION[$key])>20))
    			{	$update.=$key.'-'.$_SESSION[$key].'-'.$value;
    				$_SESSION[$key]=$value;
    				$update.='-'.$_SESSION[$key].'|';
    			}
    		}
    		$update=substr($update,0,-1);
    		session_start();
    		// *partC*
    		// headers
    		header("Access-Control-Allow-Origin: *");
    		header("Content-Type: text/event-stream");
    		header('Cache-Control: no-cache');
    		if($update!='')
    		{	// *partD*
    			// On envoie un message SSE au Process 1 du client pour signifier une mise à jour nécessaire
    			echo 'data: '._VERSION.':'.$update."\n\n";
    		}
    		else
    		{
    		        // *partE*
    		}
    		session_write_close();
    		sleep(20);
    	}
    ?>
    *partA, *partB* et *partD* fonctionnent bien.

    Le problème, c'est quand il n'y a aucune modif à envoyer (*partE*) : la console Firefox (client side) me rapporte une activité toutes les 20 secondes (sleep(20) en fin de script A) :
    Nom : sse_no_update.png
Affichages : 52
Taille : 13,5 Ko

    Comment éviter que script A envoie un message à Process 1 quand il n'y a aucune modification ? (cas *partE*) ?

    Déplacer les headers *partC* dans *partD* provoque une erreur dans Process 1 "Firefox ne peut établir de connexion avec le serveur à l’adresse xxx/sseServer.php" quand il n'y a aucune modification à envoyer.
    C'est quand un homme voit un moustique posé sur un de ses testicules qu'il comprend que la violence ne peut pas résoudre tous les problèmes.

Discussions similaires

  1. Lire une base de données avec Server Sent event
    Par QAYS dans le forum NodeJS
    Réponses: 1
    Dernier message: 09/07/2015, 20h02
  2. Erreur : La requête ne retourne aucune donnée
    Par guigui81 dans le forum Débuter
    Réponses: 6
    Dernier message: 08/07/2011, 15h26
  3. [Vxi3] reqeête ne retourne aucune donnée
    Par ahmed_amine dans le forum Deski
    Réponses: 0
    Dernier message: 11/05/2011, 13h49
  4. Réponses: 1
    Dernier message: 16/07/2008, 02h46
  5. Réponses: 2
    Dernier message: 29/01/2008, 21h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo