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

Bibliothèques & Frameworks Discussion :

Afficher la progression d'un long traitement [Prototype]


Sujet :

Bibliothèques & Frameworks

  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2004
    Messages : 219
    Points : 1 655
    Points
    1 655
    Par défaut Afficher la progression d'un long traitement
    Bonjour,

    J'utilise PHP4, MySQL4, Smarty, AJAX et Prototype (http://kpumuk.info/ajax/ajax-enabled-smarty-plugins/)

    Je dois lire un fichier csv contenant 20 000 lignes et insérer un certain nombre de ces lignes en base. Cela prend beaucoup de temps je voulais donc faire une barre de progression pour afficher l'avancement.

    Lors de l'avancement de ce traitement, je mets un rapport en base de données avec le nombre de lignes ajoutées, ignorées et les lignes avec des erreurs.

    J'ai crée un événement (AJAX) qui va vérifier toutes les 2 secondes l'état, le récupère et l'affiche.
    J'initialise l'événement puis je lance l'exécution du traitement long.

    Le problème c'est que les événements s'exécutent tous d'un coup une fois la tache longue finie.
    Pouvez-vous me dire comment je pourrais régler ce problème ?
    (Si besoin, je peux ajouter le code)

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 12
    Points : 13
    Points
    13
    Par défaut
    euh... en utilisant pas PHP ?

    a priori c'est parceque tu as une seule connection à ta BDD (il te faut un pool) et xdu coup rp acceder à la BDD ton code venant de l'AJAX doit attendre que la connexion soit libérées par ton gros script de traimtement.

    la solution pourrait être d'ouvrir une nouvelle connexion simplement ?

    Autre solution, mettre tes données d'avancement dans la session au lieu de la BDD (plus rapide et sans doute plus propore pour ce que tu semble vouloir faire, au pire tu rentres le resultat a la fin du traitement).

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    Citation Envoyé par TheSeb Voir le message
    J'ai crée un événement (AJAX) qui va vérifier toutes les 2 secondes l'état, le récupère et l'affiche.
    J'initialise l'événement puis je lance l'exécution du traitement long.

    Le problème c'est que les événements s'exécutent tous d'un coup une fois la tache longue finie.
    cela peut venir de la manière dont les appels sont faits.
    Par exemple, il ne faut pas que les appels du "traitement long" et du suivi soient fait par la même fonction (c'est quand celle-ci se termine que tu reçois "tout d'un coup").
    Pour qu'ils soient désynchronisés :
    2 setTimeout() (ou setInterval() ) distincts appelant 2 fonctions distincts
    Appels asynchrones (les 2).
    Quelque chose comme
    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
     
    ....
    function go() {
     le_suivi = setInterval("appel1()", 2000);
     le_trt = setTimeout("appel2()", 100);
    }
     
    appel1() {
     // Appel Suivi asynchrone
    }
     
    appel2() {
     // Appel Traitement long asynchrone
    }
    </script>
    </head>
    <body onload="go();">


    A+

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2004
    Messages : 219
    Points : 1 655
    Points
    1 655
    Par défaut
    Ben normalement, je ne fais pas l'appel dans la même fonction, j'ai émulé l'accès en base de donnée et cela ne vient pas de là.
    J'ai vérifié et tous mes événements sont bien exécuté d'un seul coup une fois le long traitement fini.

    Voici le code simplifié de mon template (smarty) :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    <div class="content">
    <a href="index.php">EAMT</a> &gt; <a href="admin/admin.php">Admin</a> &gt; Collect extracts.
     
    <hr class="navigation" />
     
    <h1>Collect extracts</h1>
     
       <p class="error">No extract to process.</p>
     
    <script type="text/javascript">
     
    var processExtracts = 
    {
       params: function()
       {
          return {
     
          file_1: 'export_dmu_consist_msn31_2008-02-26.csv' 
     
          }
       },
       cb: function(originalRequest)
       {
          // TODO stop perdiodical executer.
       }
    }
     
    var getReports =
    {
       params: function()
       {
          return {
          }
       },
       cb: function(originalRequest)
       {
          // Simplifications here...
          Element.update(originalRequest.responseText);
          }
       },
       initialize: function()
       {
     
       SmartyAjax.call('/EAMT/admin/extracts.php', 'get', 'f=processExtracts', processExtracts.cb, processExtracts.params); return false;
     
       }
    }
     
    var ProcessResult =
    {
       initialize: function()
       {
          new PeriodicalExecuter(this.update, 3);
       },
     
       update: function()
       {
     
        SmartyAjax.call('/EAMT/admin/extracts.php', 'get', 'f=getReports', getReports.cb, getReports.params); return false;
     
       }
    }
    ProcessResult.initialize();
    getReports.initialize();
     
    </script>
    Smarty AJAX :
    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
    var SmartyAjax = {
      update: function(update_id, url, method, params, callback) {
        var myAjax = new Ajax.Updater(
          update_id,
          url,
          {
            method: method,
            parameters: params,
            onComplete: callback
          });
      },
     
      call: function(url, method, params, callback, params_func) {
        if (params_func) {
          if (params.length != 0) params += "&";
          params += $H(params_func()).toQueryString();
        }
        var myAjax = new Ajax.Request(
          url,
          {
            method: method,
            parameters: params,
            onComplete: callback
          });
      },
     
      submit: function(form, params, callback) {
      	var myAjax = new Ajax.Request(
      		form.action,
      		{
      			method: form.method,
      			parameters: Form.serialize(form.id),
            onComplete: callback || this.onSubmit
      		});
      },
     
      onSubmit: function(originalRequest) {
        var results = originalRequest.responseText.split(";");
     
        if (results[0] == "true") {
          SmartyAjax.Messages.set(results[1], SmartyAjax.Messages.MT_WARNING)
        } else {
          SmartyAjax.Messages.clear();
          SmartyAjax.Messages.setType(SmartyAjax.Messages.MT_ERROR);
          for (var i = 1; i < results.length; i++) {
            SmartyAjax.Messages.add(results[i]);
          }
        }
      }
    }

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 70
    Points : 40
    Points
    40
    Par défaut
    Moi j'ai le meme pb est ce que vs avez trouve une soulition ??

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Bonjour,
    Citation Envoyé par khadir Voir le message
    Moi j'ai le meme pb est ce que vs avez trouve une soulition ??
    as-tu essayé celle déjà donnée ?

    A+

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 70
    Points : 40
    Points
    40
    Par défaut
    En fait moi mon problem est le suivant :
    J'ai une fonction java script qui fait deux lignes:
    1-submit d'un formulaire (son target est un iframe)
    2-appel une autre fonction ajax chaque 1000 millisecondes

    document.getElementById('frm).submit();
    fctName = "ajaxFunct()";
    idTimeOut=setTimeout(fctName, 1000);

    le pb est que ma fonction ajax reste ds l'etat 1 (xhr.readyState=1 )
    jusqua que le traitement du formulaire termine ,a noter que ce traitement est ds un autre serveur ajax ??

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 70
    Points : 40
    Points
    40
    Par défaut soulition
    Bonjour a tous ,
    en fin le pb à été résolu :

    Ce qui bloque le traitement ds l'autre serveur (demander par ajax) c'est l'utilisation des sessions (autrement dit session_start)
    et oui ,par ce que le fichier de session est deja en lecture par le 1ere serveur et il est locked jusqua qu'il termine ...

    une soulition peut etre pour la barre de progression est d'utilser une variable coté base de données et lui demander chaque fois au lieu d'utiliser une variable de session .

    Merci et @+

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

Discussions similaires

  1. [WB9] progression d'un long traitement
    Par thblandeau dans le forum WebDev
    Réponses: 4
    Dernier message: 10/02/2011, 08h22
  2. [TMS TAdvTaskDialog] Afficher la progression d'un traitement long
    Par GoustiFruit dans le forum Composants VCL
    Réponses: 10
    Dernier message: 22/07/2008, 10h41
  3. Afficher une fenetre d'attente pendant un long traitement (Swing)
    Par JavaBienOuMal dans le forum EDT/SwingWorker
    Réponses: 5
    Dernier message: 15/06/2007, 14h13
  4. Réponses: 2
    Dernier message: 12/10/2006, 15h29
  5. Réponses: 7
    Dernier message: 27/01/2006, 01h44

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