Bonsoir,

Envoyé par
Whombat
Nouvelle question du même genre : passer 30 secondes ça fait long pour le visiteur, peut-on, comme en VB par exemple, mettre un sablier au pointeur de souris ?
J'avoue que j'ai cherché mais je n'ai rien trouvé. D'habitude, IE le met tout seul mais là il ne me le met pas.
Il suffit pour cela de rajouter un style CSS sur l'élément BODY du DOM:
cursor: wait;
Mais encore faut-il qu'une page soit affichée. Si la page précédente est toujours chargée dans le navigateur (le navigateur attend une réponse du serveur avant de décharger la page précédente), activez cette règle au moment d'émettre la requête.

Envoyé par
Whombat
D'autre part, il n'affiche pas les cadres et décors prévus pourtant avant le script de tri de bdd. Il y a-t-il une technique du style xx=doevents() en VB qui oblige le script a s'exécuter avant d'aller plus loin ? Là aussi j'ai cherché mais en vain.
Cela doit signifier que PHP n'a pas encore envoyé la moindre donnée au navigateur. Les commandes echo|print|printf provoque l'ajout des arguments fournis dans une mémoire tampon qui ne sera vidé que lorsqu'il est plein, ou le script entièrement exécuté. Ca évide de très nombreux petits échanges entre le client et le serveur et prévient donc d'une saturation réseau.
Comme vous souhaitez outre-passer ce comportement, invoquez la commande 'flush()' juste avant d'invoquer votre longue commande pour ordonner à PHP de transferer les données en attente au navigateur.
Dans le cas où l'utilisateur n'a pas besoin d'attendre le résultat de la commande, je vous conseillerais plutôt de la lancer dans un nouveau processus.
Par exemple, vous pouvez délocaliser le traitement dans un nouveau fichier PHP et le lancer par la commande suivante:
exec ('php ./mon_fichier.php &')
'php' indique qu'on exécute le moteur PHP, à qui on passe comme argument le chemin d'accès au script. Le '&' est un mot Shell sur les plateformes Unixoïdes pour réclamer la création d'un nouveau processus, ne paralysant ainsi pas l'exécution courante.
Si vous avez besoin d'arguments au script de traitement (sinon l'intervention d'un utilisateur ne serait probablement pas utile ;o) ), je n'ai pas les informations sous la main. Cependant, vous devriez pouvoir les trouver facilement, soit en exécutant 'php --help' qui devrait fournir une liste des options possibles, soit en explorant la documentation PHP, du côté des exécutions en ligne de commande.
Pour finir, un petit avertissement: PHP a la tendance par défaut de tuer le script en cours lorsque l'utilisateur ferme la connection au serveur (en cliquant sur le bouton 'arrêter', ou en changeant de page). Si ce n'est pas souhaitable et que le traitement doit poursuivre même lorsque l'utilisateur abandonne la requête (ce qui peut-être courant face à un utilisateur lambda), il existe d'une part la méthode que je viens de vous proposer et d'autre part une option à activer dans 'php.ini' (dont je ne connais pas le nom) qui permet de poursuivre l'exécution du script même lorsque l'utilisateur l'abandonne.
Une nouvelle attention encore sur ce dernier cas, vous ne voudrez peut-être pas que l'utilisateur exécute n-fois de suite le traitement et il faudra alors passer par un moyen de prévenir l'exécution du traitement si un traitement est déjà en cours.
Cordialement,
Julien
Partager