Faire patienter le surfeur...

Faire patienter le surfeur... - PHP - Programmation

Marsh Posté le 03-05-2006 à 18:42:58    

Voilà, je suis sur un projet qui affiche un résultat de requête qui peut grimper haut en temps de génération, de l'ordre de plusieurs secondes.
 
Donc, pensant toujours à mes petits utilisateurs impatients, j'ai voulu leur laisser un message pour qu'ils patientent un peu, j'ai donc penser que cette technique marcherait.
 
L'utilisateur appelle mapage.php :

Code :
  1. (...) un script d'appel à la base de données, tout ça.
  2. ob_start();
  3. if (!isset($_GET['continue'])) { ?>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7. <title>MaPage</title>
  8. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  9. </head>
  10. <body>
  11. Patientez s.v.p.
  12. <?php
  13. ob_end_flush();
  14. $redir='mapage.php?continue=1';
  15. header('location:'.$redir);
  16. die('');
  17. }


 
Bon, pour ceux qui n'aurait pas compris, ma page fonctionne selon ce principe :
L'utilisateur appelle mapage.php, mon script ne trouve pas le $_get['continue'] donc il devrait afficher un message "patientez..." et je fais une redirection sur ma page en rajoutant le fameux continue=1, comme ça mon script passera sur cette condition au second appel.
 
Jusque là, ça me semble logique, sauf que ça ne fonctionne pas, ma page reste blanche tant que la page n'est pas générée sans afficher de message patientez... :/

Reply

Marsh Posté le 03-05-2006 à 18:42:58   

Reply

Marsh Posté le 03-05-2006 à 18:57:15    

Dit moi, c'est normal l'abscence de "else" entre le "if" et la partie censé être exécuté quand la condition est fausse?
En plus, tel que tu as écrit ton code, si "$_GET['continue']" n'existe pas, ca t'affiche le message d'attente ce qui est l'inverse de ce que t'indique.
 
PS : Vu que le header de redirection est situé juste aprés l'envoie de texte au navigateur faut de "else" dans ton code, la redirection n'a aucune chance de fonctionner. (une fois du texte envoyé au navigateur, aucun envoie d'header ou de cookie n'est possible)

Reply

Marsh Posté le 03-05-2006 à 19:05:51    

omega2 a écrit :

Dit moi, c'est normal l'abscence de "else" entre le "if" et la partie censé être exécuté quand la condition est fausse?
En plus, tel que tu as écrit ton code, si "$_GET['continue']" n'existe pas, ca t'affiche le message d'attente ce qui est l'inverse de ce que t'indique.
 
PS : Vu que le header de redirection est situé juste aprés l'envoie de texte au navigateur faut de "else" dans ton code, la redirection n'a aucune chance de fonctionner. (une fois du texte envoyé au navigateur, aucun envoie d'header ou de cookie n'est possible)


Oui, je me suis trompé, c'est quand le "continue" n'existe pas que le message de patientez devrait s'afficher, enfin, tu as compris le principe.
 
Autrement, le else ne sert à rien dans le sens ou si le $_GET continue n'existe pas, la condition n'est pas rempli, il passe à la suite autrement, il vide le buffet (il devrait l'afficher, c'est mon problème) et lance sa redirection.
 
Pour le header tu as raison, bizarre que je n'ai pas eu de message d'erreur.
 
Mais bon, j'ai corrigé :  

Code :
  1. header('location:'.$redir,100);
  2. ob_end_flush();
  3. die('');


Je lance un header temporisé, je vide mon buffet et je tue le script.
Mais ça ne fonctionne toujours pas.
Effectivement, une fois l'header envoyé, même temporisé, la cloture de mon buffet ne risque pas d'envoyer grand chose. :/
 
Zut, comment faire ? :/

Reply

Marsh Posté le 03-05-2006 à 19:06:02    

The-Shadow a écrit :

Voilà, je suis sur un projet qui affiche un résultat de requête qui peut grimper haut en temps de génération, de l'ordre de plusieurs secondes.
 
Donc, pensant toujours à mes petits utilisateurs impatients, j'ai voulu leur laisser un message pour qu'ils patientent un peu, j'ai donc penser que cette technique marcherait.
 
L'utilisateur appelle mapage.php :

Code :
  1. (...) un script d'appel à la base de données, tout ça.
  2. ob_start();
  3. if (!isset($_GET['continue'])) { ?>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7. <title>MaPage</title>
  8. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  9. </head>
  10. <body>
  11. Patientez s.v.p.
  12. <?php
  13. ob_end_flush();
  14. $redir='mapage.php?continue=1';
  15. header('location:'.$redir);
  16. die('');
  17. }


 
Bon, pour ceux qui n'aurait pas compris, ma page fonctionne selon ce principe :
L'utilisateur appelle mapage.php, mon script ne trouve pas le $_get['continue'] donc il devrait afficher un message "patientez..." et je fais une redirection sur ma page en rajoutant le fameux continue=1, comme ça mon script passera sur cette condition au second appel.
 
Jusque là, ça me semble logique, sauf que ça ne fonctionne pas, ma page reste blanche tant que la page n'est pas générée sans afficher de message patientez... :/


 
Je suis impressionné par l'ingéniosité de ce script (bon, comme l'a dit qqun un jour, vu mon "faible" niveau en php il n'en faut pas beaucoup pour m'impressionner :) )
Cependant j'y vois 2 pb
1) si continue n'existe pas, tu regénères un en-tête HTML. Mais cet en-tête n'est pas déjà présent au début de ta page ? => bon, pas très grave car le vrai pb est en 2
2) le principe de php est qu'il est appelé par un module d'Apache. Ce module traite tout le code et, [u]quand il a finit, rend la main à Apache qui renvoie le HTML au client (sauf en cas de "die" où là, tout s'arrête).
CLIENT -demande-> Apache -Envoi script-> Module PHP
 
ModulePHP -EnvoiRésultatHTML-> Apache -Affiche HTML-> CLIENT          
 
                                                         
Toi, tu cherches à faire une espèce de "va-et-vient" incessant du style
- j'affiche "Patientez" (chez le client)
- en-même temps, je calcule mon résultat (du coté du module PHP) et je reboucle
Ingénieux... mais impossible. Désolé


Message édité par Sve@r le 03-05-2006 à 19:10:14

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 03-05-2006 à 19:11:20    

Bon bah je vais compenser par une redirection hteumeuleu, tant pis. :D

Reply

Marsh Posté le 03-05-2006 à 19:13:04    

The-Shadow a écrit :

Zut, comment faire ? :/


Pourquoi ne pas générer une 2° page HTML en javascript avant le long calcul ?
Tu indiques dans cette 2° page que le remplissage de la 1° peut-être assez long...
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 03-05-2006 à 19:18:00    

Sve@r a écrit :

Pourquoi ne pas générer une 2° page HTML en javascript avant le long calcul ?
Tu indiques dans cette 2° page que le remplissage de la 1° peut-être assez long...


Parce que je veux éviter au maximum le js quand ce n'est pas indispensable.
 
C'est bon, j'ai résolu mon problème, si continue n'existe pas, je fais un  

Code :
  1. <?php
  2. $redir='mapage.php?continue=1';
  3. ?> <meta http-equiv="Refresh" CONTENT="0;URL=<?php echo $redir; ?>">


 
C'est moins "propre" qu'une redirection en php, mais ça fonctionne impeccable comme ça. :D


Message édité par The-Shadow le 03-05-2006 à 19:18:27
Reply

Marsh Posté le 04-05-2006 à 02:08:32    

Le js dans ton cas est une solution tout à fait acceptable. Ca ne nuit pas du tout à l'accessibilité, ça rajoute simplement une ptite fonctionnalité que un bon 90% de tes utilisateurs pourront avoir. Franchement, y a carrément pas de soucis.
 
J'irai même juste qu'à dire que c'est mieux, car y a pas un chargement de page inutile.


Message édité par Djebel1 le 04-05-2006 à 02:09:04
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed