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 :

[AJAX] barre de progression ajax


Sujet :

AJAX

  1. #1
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut [AJAX] barre de progression ajax
    Bonjour tout le monde,

    J'aurais besoin d'aide pour faire fonctionner une barre de progression AJAX. Essentiellement, je lis des données dans un fichier et je les insèrent dans la base de données. Comme ce traitement est long, je veux retourner quelque chose pour que l'utilisateur voit qu'il se passe quelque chose.

    Du côté client, tout va bien, j'ai trouvé comment faire fonctionner le tout ainsi que comment dire à la page HTML d'aller interroger le serveur à intervalle régulier. Je me suis basé sur ce site pour y arriver:

    http://www.redips.net/javascript/ajax-progress-bar/

    CEPENDANT... c'est du côté serveur que j'ai de la misère. J'arrive sans problème à calculer le pourcentage de progression en faisant une première passe dans mon fichier pour compter le nombre de lignes total. Ensuite c'est simplement de calculer le tout par rapport à la ligne où je suis rendu.

    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
     
     
    //Première passe pour lire le nombre de ligne au total
     
    $fichier = fopen($nomFichierProduit, 'r');
    $nombreLignesFichierProduit = 0;
    $numeroLigneFichierProduit = 0;
    $pourcent = 0;
     
    while ($ligne = fgets($fichier))
    {
    	$nombreLignesFichierProduit++;
    }
     
    fclose($fichier);
     
    //Deuxième passe où j'insère dans la BD
     
    $fichier = fopen($nomFichierProduit, 'r');
    while ($ligne = fgets($fichier))
    {
    	//requête d'insertion dans la BD
            $numeroLigneFichierProduit++;
            $pourcent = $numeroLigneFichierProduit / $nombreLignesFichierProduit * 100;
    }
    Le problème que j'ai c'est que si je fais un "echo" dans mon script, je me ramasse avec une réponse serveur totalement aberrante du style:

    <document>
    <progres>1</progres>
    <progres>2</progres>
    <progres>3</progres>
    <progres>4</progres>
    <progres>5</progres>
    <progres>6</progres>
    <progres>7</progres>
    <progres>8</progres>
    <progres>9</progres>
    <progres>10</progres>
    </document>

    And so on, comme on dit en anglais... C'est normal que ça fasse ça parce que le echo est toujours cumulatif, mais mon fichier fait pas loin de 20000 lignes alors vous imaginez la tête de ma réponse serveur quand je la demande par AJAX? À noter que ma méthode de calcul de pourcentage est correcte parce que je me retrouve quand même avec la bonne valeur... mais disons que dans ce cas-ci, l'historique ne m'intéresse pas, si je puis m'exprimer ainsi. Quelqu'un saurait comment éviter ce désagrément?

    Merci d'avance

    Osu

  2. #2
    Membre habitué
    Inscrit en
    Janvier 2007
    Messages
    437
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 437
    Points : 184
    Points
    184
    Par défaut
    et si tu fais un print au lieu d'un echo tu as le même resultat ?

  3. #3
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    J'ai effectivement le même résultat . J'aurais pourtant cru que le plus compliqué aurait été de calculer la valeur... pas de la retourner à l'utilisateur.

  4. #4
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Je ne vois pas dans ton code la traitement du serveur suite à une requête Ajax du client pour demander l'état d'avancement. D'ailleurs dans le code cité, aucun echo apparaît à moins que mes yeux ne me jouent des tours !

    Normalement le fonctionnement normal devrait être :
    1. Appel Ajax du client
    2. Calcul du pourcentage par le serveur (X %)
    3. Retour de la réponse avec un echo (echo 'X')

    Je ne comprends pas pourquoi tu inclurais ton echo dans une boucle ?
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  5. #5
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Tu as essayé avec un flush et coté JavaScript un test sur le readyState 3 ?
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  6. #6
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Nounetmasque, j'ai effectivement malencontreusement omis de mettre le echo dans la boucle, mais tu as quand même compris ce que je voulais dire . Cependant, n'ayant pas réussi à trouver d'exemple bien expliqué sur Internet, je dois avouer que ma compréhension AJAX est relativement limitée. J'ai déjà essayé de faire un truc dans le genre côté 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
     
    //Première passe pour lire le nombre de ligne au total
     
    $fichier = fopen($nomFichierProduit, 'r');
    $nombreLignesFichierProduit = 0;
    $numeroLigneFichierProduit = 0;
    $pourcent = 0;
     
    if (isset($_POST['fichier']))
    {
    while ($ligne = fgets($fichier))
    {
    	$nombreLignesFichierProduit++;
    }
     
    fclose($fichier);
     
    //Deuxième passe où j'insère dans la BD
     
    $fichier = fopen($nomFichierProduit, 'r');
    while ($ligne = fgets($fichier))
    {
    	//requête d'insertion dans la BD
            $numeroLigneFichierProduit++;
            $pourcent = $numeroLigneFichierProduit / $nombreLignesFichierProduit * 100;
    }
    }
    else
    {
    echo $pourcent;
    }
    Et évidemment, au niveau client, je lui passe simplement une requête vide une fois que la première requête pour commencer le traitement est envoyée, ce qui rend ce if fonctionnel. Cependant, tout ce que je reçois c'est

    0

    À tête reposée cependant, je réalise que la ligne $pourcent = 0; a peut-être quelque chose à y voir. En fait, je crois que je devrais peut-être remplacer le

    echo $pourcent

    par

    echo $numeroLigneFichierProduit / $nombreLignesFichierProduit * 100;

    Mais le problème reste le même parce que j'initialise mes variables à l'extérieur du "if". Donc $numeroLigneFichierProduit et $nombreLignesFichierProduit vont également être à 0. Comment dois-je faire pour ne pas perdre mon pourcentage d'un appel à l'autre? C'est précisément là que je bloque... et personne sur Internet ne semble vouloir expliquer clairement cette étape pourtant cruciale. Si je pouvais avoir une ébauche de code pour me donner une idée de comment procéder, ça serait grandement apprécié.

    Merci,

    Osu

  7. #7
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Comme tu l'as expliqué le problème vient du fait que tu utilises la variable $pourcent qui est réinitialisée à chaque nouvel appel Ajax. Je pense que la meilleur solution est de stocker ta valeur en session.

    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
    if (isset($_POST['fichier'])){
            $nombreLignesFichierProduit = 0;
            $numeroLigneFichierProduit = 0;
            $_SESSION['pourcent'] = 0;
    
    	while ($ligne = fgets($fichier)){
    		$nombreLignesFichierProduit++;
    	}
     
    	fclose($fichier);
     
    	//Deuxième passe où j'insère dans la BD
     
    	$fichier = fopen($nomFichierProduit, 'r');
    	while ($ligne = fgets($fichier)){
    		//requête d'insertion dans la BD
            $numeroLigneFichierProduit++;
            $_SESSION['pourcent'] = $numeroLigneFichierProduit / $nombreLignesFichierProduit * 100;
    	}
    }else{
    	echo $_SESSION['pourcent'];
    }
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  8. #8
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Merci pour le tip, j'essaye ça dès que j'arrive au boulot et je t'en redonne des nouvelles

  9. #9
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Bon, j'ai essayé ton truc, mais ça ne règle pas plus mon problème. J'utilise firebug pour avoir un aperçu de ce qui se passe et je vois bien mes requêtes partir à toutes les 1.5 secondes... mais elles ont toutes l'état "aborted", comme si le serveur ne répondait pas aux demande. J'ai essayé de mettre des flush de la façon suivante pour voir si ça allait aider les choses, mais ça n'a rien changé. La seule fois où je reçois une réponse c'est quand le pourcentage est rendu à 100... ce qui ne m'aide pas vraiment

    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
     
    if (isset($_POST['fichier'])){
    echo "debut";
    flush();
            $nombreLignesFichierProduit = 0;
            $numeroLigneFichierProduit = 0;
            $_SESSION['pourcent'] = 0;
     
    	while ($ligne = fgets($fichier)){
    		$nombreLignesFichierProduit++;
    	}
     
    	fclose($fichier);
     
    	//Deuxième passe où j'insère dans la BD
     
    	$fichier = fopen($nomFichierProduit, 'r');
    	while ($ligne = fgets($fichier)){
    		//requête d'insertion dans la BD
            $numeroLigneFichierProduit++;
            $_SESSION['pourcent'] = $numeroLigneFichierProduit / $nombreLignesFichierProduit * 100;
    	}
    }else{
    	echo $_SESSION['pourcent'];
    flush();
    }

  10. #10
    Membre confirmé Avatar de nounetmasque
    Inscrit en
    Janvier 2003
    Messages
    494
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 494
    Points : 570
    Points
    570
    Par défaut
    Je pense qu'il faut revoir le fonctionnement côté serveur puisque ton script reste bloqué tant que la boucle d'insertion en base n'a pas terminé son traitement. Cela explique qu'aucune requête n'aboutit sauf la dernière qui indique 100%.

    A la limite tu peux solutionner ton problème en utilisant deux scripts côté serveur. Le premier qui initialisera tes variables et qui se chargera de remplir la base. Le deuxième qui interrogera seulement la session pour connaître le pourcentage chargé en BDD.
    "Dieu reste muet, si seulement nous pouvions convaincre l'être humain d'en faire autant."

  11. #11
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    J'ai essayé avec deux scripts différents... et ça fonctionne pas plus. Le pourcentage retourné par le second script est toujours le même... soit 0. C'est comme si le deuxième script n'interrogeait pas la même variable $_SESSION que le premier script. Quelqu'un connaîtrait une place où ils expliquent comment faire ce que je veux faire parce que je dois avouer être arrivé dans un joli cul de sac. Si vous me permettez d'exprimer un peu de frustration: On dirait que tout le monde considère la partie serveur du AJAX comme étant triviale et ne se contentent que d'expliquer le côté client!

    Bon, ceci dit, ceci n'était qu'une petite expression de ma frustration des derniers jours à chercher partout sans trouver d'exemple concret qui colle à ce que je veux faire. Je ne voulais froisser personne et je remercie même ceux qui ont tenté de m'aider.

    Pour conclure, si quelqu'un connaît un bon site avec des tutoriels bien expliqués sur le AJAX, je lui serais vraiment reconnaissant de me le faire parvenir.

    Merci d'avance

    Osu

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Points : 109
    Points
    109
    Par défaut
    Une petite idée, si tu sais déterminer avant le traitement le nombre de lignes à insérer ds ta db, pourquoi ne pas, par exemple, faire 10 appels ajax pour mettre à jours ta db, avec ds chaque appel, l'envoi de 10% des lignes à insérer, et faire une mise à jour à chaque appel, du compteur qui affiche ta progression.(qui progresserait dans ce cas-ci, par pas de 10% mais c'est un paramètre que tu peux changer en fonction de la vitesse du script).
    Avant de commencer un nouvel appel ajax, tu attends que le précédent soit terminé (readystate?).
    C'est juste une idée, je ne sais pas si elle est facilement implémentable....

    Alpha.

  13. #13
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Déterminer combien de ligne j'ai à lire dans mon fichier est relativement simple puisqu'il s'agit d'un fichier texte que je lis avec fgets. Tout ce que j'ai à faire c'est passer dans mon fichier une première fois et incrémenter un compteur. Je le fais déjà et cette partie marche bien.

    Après ça, je pourrais effectivement passer la ligne à mon script par le biais d'une requête SJAX (Synchronous Javascript And XML) et recalculer mon pourcentage à intervalle régulier. J'utilise une approche similaire pour retourner les résultats d'une recherche et mettre à jour un tableau ailleurs sur mon site.

    J'imagine que, dans mon cas, c'est l'alternative la plus simple pour arriver à faire ce que je veux faire. Merci du conseil, je vais voir ce que ça va donner .

    Osu

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je sais qu'il existe une méthode de lien "maintenu" entre "le html et son javascript" d'un visiteur, et un PHP du serveur., mais je n'ais jamais approfondie cette méthode. Il me parait que ce serait assurément ta solution.

    AJAX c'est autre chose, c'est un lien "éphémére" entre "le html et son javascript" d'un visiteur et un PHP qu'AJAX appelerait pour aller chercher une
    réponse. A ce sujet les AJAX qui appellent un PHP précis avec un timer, ont souvent des surprises avec les sessions par exemple.

    Voila je voulais juste te montrer cet aspect du mécanisme AJAX.

  15. #15
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Lien maintenu? Je crois effectivement que ça pourrait définitivement m'intéresser. Tu connais un endroit où ils parlent de cette méthode?

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par osuwariboy Voir le message
    Lien maintenu? Je crois effectivement que ça pourrait définitivement m'intéresser. Tu connais un endroit où ils parlent de cette méthode?
    Je t’ai dit ne pas encore maîtriser, mais le fait de passer en false (synchrone)
    pourrait donner cet équivalent.

    Il doit y avoir chez nous un tuto sur le sujet
    Dernière modification par Sendusha ; 30/05/2011 à 09h09.

  17. #17
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Ah oui, passer la requête en false, c'est le fameux SJAX dont je parlais quelques répliques plus haut... et c'est justement cette méthode que je maîtrise lol. Essentiellement, tout ce que ça fait c'est que quand tu appelles la fonction "send" de ta requête HTTP, le navigateur gèle jusqu'à ce qu'une réponse arrive. Tu n'as donc plus besoin de ce qu'on appelle une fonction "callback" pour traiter la réponse du serveur puisque tu l'as immédiatement après le send.

    Dans mon cas, cela ne m'avantage pas vraiment parce que la réponse que je reçois ne m'arrive qu'une fois que le script a terminé son exécution... et moi je veux un indicatif de progression.

    J'ai trouvé un truc qui s'appelle Comet ou c'est le serveur qui fait des push au client et cela pourrait probablement coller à ce que je désire faire. Cependant, comme bien des choses que je trouve sur Internet, bien des gens semblent connaître et apprécier, mais personne ne dit clairement comment mettre en oeuvre (dans ce cas, je n'ai même pas encore trouvé d'exemples de code... ce qui est légèrement frustrant).

    Enfin, merci quand même de la suggestion . Et j'avais compris que tu ne maîtrisais pas, mais tu aurais pu quand même connaître une source d'information qui m'aurais échappé .

    Merci quand même .

    Osu

  18. #18
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Pour ceux que ça intéresserait, j'ai réussi à confirmer que pour faire ce que je veux faire, il me faut vraiment utiliser l'approche Comet. Après quelques recherches, j'ai réussi à comprendre l'essentiel du fonctionnement (c'est encore rudimentaire, mais c'est déjà un début). Voici ce que j'ai en tête:

    On crée essentiellement 3 pages:

    1) La page PHP contenant notre script serveur (évidemment)
    2) Une page HTML contenant le code nécessaire pour afficher notre progression
    3) Une page contenant un frame invisible relié à la page 1) ainsi qu'un autre frame visible relié à la page 2)

    L'idée derrière tout ça est que quand on fait des echo du côté du serveur, on appelle essentiellement une fonction positionnée dans la page 3) qui se charge de rediriger les données envoyées au frame visible.

    Bien entendu, je n'ai pas encore fignolé les menu détails de la procédure, mais voilà le site qui m'a permis de comprendre les fondements de l'approche:

    http://www.eutech-ssii.com/ressources/9

    A+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/02/2014, 12h27
  2. [AJAX] barre de progression & Ajax
    Par Bordak dans le forum AJAX
    Réponses: 3
    Dernier message: 09/03/2012, 14h27
  3. Réponses: 3
    Dernier message: 12/01/2010, 10h26
  4. [AJAX] Upload et barre de progression
    Par dremos dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/01/2009, 00h17
  5. [AJAX] Utilisation d'un barre de progression
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/03/2008, 16h22

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