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

AJAX Discussion :

Long polling lecture en boucle


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Recherches en Informatique
    Inscrit en
    Juillet 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherches en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 60
    Par défaut Long polling lecture en boucle
    Bonjour,
    j'ai créé un système de notification avec Ajax, cela fonctionne bien, j'ai utilisé la fonction setTimeout()... Le prob. ce que cela crée un trafic extrêmement important pour mon serveur... Après quelques recherches, j'ai découvert le Server-Push long polling...

    J'ai implémenté un code Lon Polling, mais ça réaction n'est pas celui attendu... Ça répète un même message à chaque x seconde déterminé... Or selon mes recherches, ça ne devrai afficher un nouveau message uniquement s'il y a une modification dans le serveur (BDD)...

    Mon code doit afficher une série d’information entré par plusieurs utilisateurs, mais tout cela sur une page.

    Voilà un peut ce que j'ai fait:
    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
     
          <script type='text/javascript'>
            $(document).ready(function() {
                getData();
            });
     
            function getData() {
                $.ajax({
                    type: "POST",
                    url: "view/all-views/show_all.php",
                    async: true,
                    timeout: 50000,
                    data: "get=true",
                    success: function(data) {
                        $("#response").append(data);
     
                        setTimeout("getData()", 5000);
                    }
                });
            }
        </script>
    Merci...

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Bonjour,
    Ça répète un même message à chaque x seconde déterminé... Or selon mes recherches, ça ne devrai afficher un nouveau message uniquement s'il y a une modification dans le serveur (BDD)...
    dans ce que tu montre c'est le client qui fait la requête donc c'est du "long polling JS" et non Serveur.

    Dans ton cas, ce que tu pourrais tester c'est si le message à déjà fait l'objet d'un envoi en faisant une vérification sur la date/heure.

  3. #3
    Membre actif
    Homme Profil pro
    Recherches en Informatique
    Inscrit en
    Juillet 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherches en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 60
    Par défaut
    Citation Envoyé par NoSmoking Voir le message

    Dans ton cas, ce que tu pourrais tester c'est si le message à déjà fait l'objet d'un envoi en faisant une vérification sur la date/heure.
    Merci, ta réponse m'a orienté encore mieux...

    J'ai trouvé l'exemple suivant qui consiste à lire un fichier tex, et afficher le contenu à chaque modification... d'afficher le resultat de ma bdd, ça ne marche pas, même pas un signe de vie.

    Voilà un peut le code:
    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
     
    $dataFileName = '../../view/rsult/data_bdd.txt'; 
    	while ( true )
    	{
    	    $requestedTimestamp = isset( $_GET['timestamp'] ) ? (int)$_GET['timestamp'] : null;      
     
    	    // o PHP faz cache de operações "stat" do filesystem. Por isso, devemos limpar esse cache   
    	    clearstatcache();  
     
    	    $modifiedAt = filemtime( $dataFileName );       
     
    	    if ( $requestedTimestamp == null || $modifiedAt > $requestedTimestamp )
    	    {
    	        $data = file_get_contents( $dataFileName );
     
    	        $arrData = array(
    	            'content' => $data,
    	            'timestamp' => $modifiedAt
    	        );
     
    	        $json = json_encode( $arrData );
     
    	        echo $json;
     
    	        break;
    	    }
    	    else
    	    {
    	        sleep( 2 );
    	        continue;
    	    }

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Le principe reste le même.

    En préalable il te faut stocker un champs de type DATETIME pour chaque "post".

    Tu interroges la BdD pour savoir si il y a un/des post(s) récent(s) par rapport à la date/heure de la demande
    • SI OUI tu envoies les news
    • SI NON tu refais la demande au bout d'un temps raisonnable

  5. #5
    Membre actif
    Homme Profil pro
    Recherches en Informatique
    Inscrit en
    Juillet 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Recherches en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 60
    Par défaut
    Oui, je l'ai fait...
    Avec FireBug 2.0.11 je voie bien une connexion (canal) en attente, mais après elle s'arrête...
    Le canal reste à l'écoute si je donne mon fecht_bd la valeur null, (fecht_bd = null)...

    Et donc par là ça donne du n'importe quoi...
    Voilà un peut mes modifications Serveur et Client

    Code serveur
    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
     
    # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 
    		# SELECT MySQL - http_PUSH  | Show page content
    	set_time_limit(0);
    	$fecht_ac = isset($_POST['timestamp']) ? $_POST['timestamp']:0;
    	$fecht_bd = $ar['timestamp'];
     
    	while ($fecht_bd <= $fecht_ac) {
    		# code...
    		$query_SQL_tmp = 'SELECT timestamp FROM mensajes ORDER BY timestamp DESC LIMIT 1';
    		$show_STM_tmp = $bdd->prepare($query_SQL_tmp);
    		$show_STM_tmp->execute() or die(print_r($show_STM_tmp->errorInfo()));
    		$numComentarions = $show_STM_tmp->rowCount(); # numero de comentarios
    		$rs = $show_STM_tmp->fetch();	
     
    		usleep(10000);
    		clearstatcache();
    		$fecht_bd = strtotime($rs['timestamp']);		
    	}
    	$query_SQL = 'SELECT * FROM mensajes ORDER BY timestamp DESC LIMIT 1';
    	$show_STM = $bdd->prepare($query_SQL);
    	$show_STM->execute() or die(print_r($show_STM->errorInfo()));
    	$numComentarions = $show_STM->rowCount(); # numero de comentarios
    	// $comentarioResult = $comentStm->fetch();	
    	while ($row = $show_STM->fetch()) {
    		# code... 
    		//echo "Sou millionario em $US";
    		$ar['timestamp'] = $row['timestamp'];
    		$ar['mensaj']    = $row['mensaj'];
    		$ar['id']        = $row['id'];
    		$ar['nt']		 = $row['nt'];
    	}
    $data_json = json_encode($row);
    echo $data_json;
    Code client
    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
     
    <script type="text/javascript">
    		var timestamp = null;
    		function cargar_push () {
    			// body...
    			$.ajax({
    				async: true,
    				type: "POST",
    				url: "http_push.php",
    				data: "&timestamp="+timestamp,
    				dataType: "html",
    				success: function(data){
    					var json   = eval("(" + data + ")");
    					timestamp  = json.timestamp;
    					mensaj     = json.mensaj;
    					nt         = json.nt;
     
    					if (timestamp == null) {
     
    					}else{
    						$.ajax({
    							async: true,
    							type: "POST",
    							url: "mensajes.php",
    							data:"",
    							dataType: "html",
    							success: function(data){
    								$('#contenido').html(data);
    							}
    						});
    					}
    					setTimeout(cargar_push(), 1000);
    				}
    			});
    		}
    		$(document).ready(function(){
    			cargar_push();
    		});
    	</script>

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Je voyais plutôt quelque chose dans cet esprit coté serveur
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $requete = 'SELECT * FROM message WHERE message_date >= date_connect');
    do {
      $result = $base-> query($requete);
      $count = $result->rowCount();
      if( $count){
        // mise en forme résultat
        $buffer = '';
      }
      else{
        sleep(5); // par exemple
      }  
    } while( $count);
    echo $buffer;
    en gérant bien sûr la date_connect.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH 8] Lecture en boucle d'un clip particulier
    Par Yann04 dans le forum Flash
    Réponses: 1
    Dernier message: 27/02/2007, 07h19
  2. Lecture fichier, boucle et concaténation
    Par yabbiyou dans le forum MATLAB
    Réponses: 3
    Dernier message: 23/02/2007, 19h31
  3. [vb6] Lecture en boucle via port COM
    Par Original Prankster dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 25/10/2006, 21h34
  4. Problème de lecture en boucle
    Par masseur dans le forum Flash
    Réponses: 3
    Dernier message: 17/10/2006, 15h14
  5. lecture en boucle sous firefox
    Par ptichat dans le forum Flash
    Réponses: 4
    Dernier message: 19/06/2006, 10h34

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