Ajax: traiter les données progressivement

5 réponses
AuteurMessage

schtroumpf |
Modérateur

Photo de schtroumpf

Inscrit le : 05/04/2007

# Le 02/04/2009 à 16:08

Bonjour,

je cherche à trouver une solution à un problème plutôt sioux :

Un bout de code javascript envoie une xmlHttpRequest au serveur de manière asynchrone. Jusque là, rien de compliqué.
Le serveur envoie les données demandées progressivement, par paquets. Cela peut prendre jusqu'à 30 ou 60 secondes.
Je souhaite que les paquets envoyés soient traités par javascript dès qu'ils arrivent sur le navigateur, et non pas une fois que tous les paquets sont arrivés. L'idée, c'est d'évaluer la réponse de xmlHttpRequest à chaque fois qu'elle change et tant qu'elle n'est pas complète.

Des idées?

Arnaud

VisoterraOuvrir dans une nouvelle fenetre - VisofloraOuvrir dans une nouvelle fenetre - VisorandoOuvrir dans une nouvelle fenetre

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 02/04/2009 à 16:14

Hello,

le plus simple à mon avis c'est de faire plusieurs requêtes, parce que vue le nombre d'intermédiaires, susceptibles de bufferiser le résultat, t'es pas prêt de t'en sortir.

Exemple de chaine chiante à débugger : PHP -> FastCGI -> Apache -> reverse proxy -> proxy -> antivirus -> navigateur

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

schtroumpf | Arnaud
Modérateur

Photo de schtroumpf

Inscrit le : 05/04/2007

# Le 02/04/2009 à 16:54

Super, merci pour vos réponses.

dob, ton idée me paraît bonne, je vais tester. Je croyais que la fonction setTimeout était synchrone, mais ce n'est pas le cas apparemment, je viens de faire un petit test.

Bool, concernant la bufferisation, je m'en sort plutôt bien avec des flush() dans php. J'ai un petit comparateur qui tourne depuis 1 ans sur le principe et qui marche plutôt pas mal. La différence, c'est que dans son cas, c'est la page html de résultats qui s'affiche à jour progressivement et non suite à un xmlHttpRequest.

Arnaud

VisoterraOuvrir dans une nouvelle fenetre - VisofloraOuvrir dans une nouvelle fenetre - VisorandoOuvrir dans une nouvelle fenetre

Rano | Jean
Modérateur

Photo de Rano

Inscrit le : 13/04/2005

# Le 02/04/2009 à 17:06

Ce que dit bool c'est que ça peut marcher chez toi mais pas être le cas chez tout le monde. Ça depends des configs de tes serveurs mais aussi du fai et du post client

Chambres d'hote tavelOuvrir dans une nouvelle fenetre
Séjours en provenceOuvrir dans une nouvelle fenetre
Forum mariageOuvrir dans une nouvelle fenetre

schtroumpf | Arnaud
Modérateur

Photo de schtroumpf

Inscrit le : 05/04/2007

# Le 02/04/2009 à 17:43

Ok, merci pour la précision. C'est un peu plus clair dans ma petite tête.

J'ai deux interprétations de la solution de Bool :

- une requète xmlHttpRequest par paquet que l'on souhaite recevoir(ça peut donc faire plusieurs requêtes simultanées, or j'ai vu que IE les limite à 2. 8 pour Firefox). Donc solution à éliminer à mon avis.

- une première requête qui lance une tâche de fond sur le serveur et qui se termine dès que la tâche démarre. Cette tâche va construire les paquets au fur et à mesure et les stocker en attendant que des requêtes lancées un setTimeout viennent les récupérer progressivement. Dès que la tâche de fond est terminée, la dernière requête lancée récupère les derniers paquet et stop le setTimeout.
Avantage : on ne ne garde les requêtes ouvertes que le temps nécessaire à l'évaluation de l'avancement de la tâche de fond et la récupération des paquets déjà construits.
Problème : je ne sais pas lancer la tâche de fond à partir d'un script php de manière asynchrone (fermer le script php avant que la tâche soit terminée). Ca doit être tout con, désolé pour mon ignorance...

Arnaud

VisoterraOuvrir dans une nouvelle fenetre - VisofloraOuvrir dans une nouvelle fenetre - VisorandoOuvrir dans une nouvelle fenetre

schtroumpf | Arnaud
Modérateur

Photo de schtroumpf

Inscrit le : 05/04/2007

# Le 02/04/2009 à 18:09

Pour répondre à mon dernier problème, ça a l'air de le faire avec la fonction exec()

Je vais essayer.

Arnaud

VisoterraOuvrir dans une nouvelle fenetre - VisofloraOuvrir dans une nouvelle fenetre - VisorandoOuvrir dans une nouvelle fenetre

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 24/11/2024 4:38:01 | Généré en 4.68ms | Contacts | Mentions légales |