Bonjour!
Voici un problème que je n'arrive pas à résoudre. Merci à celui qui a déja rencontré ce type de problème de me venir en aide!
Afin de diviser le traitement coté serveur je voudrais envoyer plusieurs appels XMLHttpRequest qui me retournent une valeur de controle. Ces valeurs sont aussi utilisées comme décompte pour signaler la progression au client. J'ai simplifié le code pour en montrer le principe.
Ce qui se passe malheureusement, c'est que ce code n'affiche que le décompte final (0) et non les décomptes intermédiaires (5 puis 4, 3, 2, 1...). L'intruction Sleep est là pour ralentir le processus durant les tests : on devrait donc voir s'afficher un décompte de 5 à 0, de seconde en seconde.
Pourquoi développer ce code ? Le but est d'écrire un code permettant de partitionner les processus coté serveur pour éviter les charges excessives et les timeout. Cette approche permettrait par exemple de manipuler des dizaines de milliers de contacts d'une table SQL en plusieurs fois, en retournant une notification de progression ( "nombre fiches traitées : 4300. Temps restant : 5 minutes").
Explication des codes ci-dessous : la page XHR1.php contient un formulaire qui envoie une requete à la page XHR2.php.
Code de la page d'envoi ( XHR1.php)
----------------------------------
CODE de la PAGE TRAITEMENT ( XHR2.php)
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 <head><script language="javascript"> function request(f) { var method = "POST"; var filename = "XHR2.php"; var xhr_object = null; if(window.XMLHttpRequest) // Firefox xhr_object = new XMLHttpRequest(); else if(window.ActiveXObject) // Internet Explorer xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); else { // not supporting alert("Error"); return; } var countdown = f.elements["countdown"].value; var data = "countdown=" + countdown; xhr_object.onreadystatechange = function () { if(xhr_object.readyState == 4) { var tmp = xhr_object.responseText; // alert ( tmp ); f.elements["countdown"].value = tmp; if ( countdown > 0 ) request(f); } } xhr_object.open(method, filename, false); xhr_object.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr_object.send(data); xhr_object.abort(); } </script> </head> <body> <FORM onsubmit="return false;" action=""> <INPUT id=countdown size=5 name=countdown> <BR> <INPUT onclick=request(this.form) type=button value="TEST"> </FORM> </body>
-----------------------------------
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 <?php header('Content-type: text/html; charset=iso-8859-1'); if(isset($_POST["countdown"])) { sleep (1); $countdown = $_POST["countdown"]; if ( $countdown > 0 ) { // FAIRE PROCESSING LONG DB/FICHIER $somedelay = 1; // 1 COMME VALEUR D'EXEMPLE // AJUSTE DECOMPTE $countdown = $countdown - $somedelay; } echo $countdown; } ?>
Partager