Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript > Bibliothèques & Frameworks > Prototype & Script.aculo.us
Prototype & Script.aculo.us Forum d'entraide sur les frameworks Prototype et Script.aculo.us
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/03/2008, 17h01   #1
Rédacteur
 
Inscription : avril 2004
Messages : 219
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2004
Messages : 219
Points : 1 580
Points : 1 580
Par défaut [Prototype] 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)
__________________
Exercices en Java :
http://sebastien-estienne.developpez...utoriels/java/
TheSeb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2008, 04h19   #2
Candidat au titre de Membre du Club
 
Inscription : août 2003
Messages : 12
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 12
Points : 12
Points : 12
Envoyer un message via AIM à temsa
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).
temsa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2008, 15h14   #3
Responsable Modération
 
Homme
Inscription : janvier 2007
Messages : 9 315
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 : 9 315
Points : 15 609
Points : 15 609
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 :
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+
E.Bzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2008, 21h16   #4
Rédacteur
 
Inscription : avril 2004
Messages : 219
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2004
Messages : 219
Points : 1 580
Points : 1 580
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 :
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 :
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]);
      }
    }
  }
}
__________________
Exercices en Java :
http://sebastien-estienne.developpez...utoriels/java/
TheSeb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2008, 12h05   #5
Candidat au titre de Membre du Club
 
Inscription : juillet 2007
Messages : 66
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 66
Points : 13
Points : 13
Moi j'ai le meme pb est ce que vs avez trouve une soulition ??
khadir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2008, 12h07   #6
Responsable Modération
 
Homme
Inscription : janvier 2007
Messages : 9 315
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 : 9 315
Points : 15 609
Points : 15 609
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+
E.Bzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2008, 12h16   #7
Candidat au titre de Membre du Club
 
Inscription : juillet 2007
Messages : 66
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 66
Points : 13
Points : 13
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 ??
khadir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2008, 18h05   #8
Candidat au titre de Membre du Club
 
Inscription : juillet 2007
Messages : 66
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 66
Points : 13
Points : 13
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 @+
khadir est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h34.


 
 
 
 
Partenaires

Hébergement Web