Voilà mon problème : j’ai une grande boucle while qui dure un certain temps. Comment puis je faire pour avoir une sorte de compteur qui m’affiche la progression ?
J’ai du php avec la possibilité de faire du MySQL.
Voilà mon problème : j’ai une grande boucle while qui dure un certain temps. Comment puis je faire pour avoir une sorte de compteur qui m’affiche la progression ?
J’ai du php avec la possibilité de faire du MySQL.
Voilà mon problème : j’ai une grande boucle while qui dure un certain temps. Comment puis je faire pour avoir une sorte de compteur qui m’affiche la progression ?
J’ai du php avec la possibilité de faire du MySQL.
Merci pour votre aide B)[/quote]
Si l’objectif est de faire patienter ton visiteur, c’est quasiment mission impossible si tu ne casses pas ta boucle en plusieurs séquences. PHP est interprété côté serveur, donc les phases “atomiques” (indivisibles) sont :
1 - le client (naviagteur) demande la page PHP au serveur
2 - le serveur exécute le PHP qui lui renvoie du texte ou du binaire
3 - le serveur renvoie ce texte ou binaire au client
La phase bloquante dans ton cas est la phase 2 : il ne se passe rien tant qu’elle n’est pas finie. Toutefois, ça c’est la théorie. En jouant les output buffers tu as peut-être moyen d’obtenir quelque chose mais ça risque d’être assez sioux à faire. Regarde sur php.net du côté des fonctions ob_* : ob_end_flush(), etc.
Tu seras confronté à la chaine de bufferisation de l’ensemble de ton serveur. Apache, PHP, voire le système. Si tu ajoutes à cela certaines options de compression (aussi bien au niveau d’Apache qu’au niveau de PHP) ça complique un peu plus la chose. Bref, bon courage…
Si tu y arrives, tiens nous au courant, ça sera pas perdu ! B)
Si ta boucle est capable de “s’auto-évaluer”, tu rajoute une ligne qui t’écris quelque part le pourcentage de progression (vers une table sql, un fichier texte, etc).
Ta page client appelle cette donnée (refresh) toutes les secondes.
C’est du cochon coding, mais ça devrait fonctionner (du moins je pense)
[quote=“bdfck, post:4, topic: 32595”]Je vois peut-etre une méthode (cochon inside)
Si ta boucle est capable de “s’auto-évaluer”, tu rajoute une ligne qui t’écris quelque part le pourcentage de progression (vers une table sql, un fichier texte, etc).
Ta page client appelle cette donnée (refresh) toutes les secondes.
C’est du cochon coding, mais ça devrait fonctionner (du moins je pense)[/quote]
moi j’aurais proposé d’ecrire dans un fichier et d’afficher ce fichier dans une frame qui s’auto refresh avec du meta code
[quote=“AntoineViau, post:3, topic: 32595”]il ne se passe rien tant qu’elle n’est pas finie.[/quote]Ah bon ?
Exemple : afficher le nombre de secondes :<?php for ($i = 0; $i <= 10; $i++) {sleep(1);print($i.',');} ?>okou<?php $i = 0; while($i <= 10) {sleep(1);print($i.',');$i++;} ?>okChez moi ça affiche un numéro chaque seconde puis “ok”.
Exemple : afficher le nombre de secondes :<?php for ($i = 0; $i <= 10; $i++) {sleep(1);print($i.',');} ?>okou<?php $i = 0; while($i <= 10) {sleep(1);print($i.',');$i++;} ?>okChez moi ça affiche un numéro chaque seconde puis “ok”.[/quote]
ouais il me semble aussi que c’est le fonctionnement normal de php. dés qu’il y a un print un echo ou que sais-je ca envoie vers le buffer de sortie(et ca declenche donc par la même, l’envoi des headers http par défaut si on en a pas précisé). les ob_start() ob_stream, etc décrit plus haut, ça sert justement a contourner ce fonctionnement …
Tu déclare une fonction qui s’execute toutes les X secondes, qui donne l’état ou ça en est et qui flush la sortie.
Tu peux aussi faire l’affichage dans ta boucle directement et flusher (sans déclarer d’action sur un tick donc), mais ça ne sera pas forcément “régulier” (maintenant je sais pas si c’est important pour toi)
Bon et bien sur ça suppose que ton serveur web ne bufferise pas la sortie.
a coup de flush() y’a moyen de faire quelque chose…
Allah Volée (surement a débuguer), ca donnerait qqch du genre :
[code]
0%
<?php
while ($condition) {
[-- ton code --]
// evaluation du pourcentage effectué par ta boucle (a toi de jouer pour la trouver et assigner a $pourcent)
$pourcent = ($x*$y)/$z;
echo “\n”."<script language=“Javascript”>getPercent(".$pourcent.",‘divPourcentage’);";
ob_flush();
flush();
}
?>[/code]
Donc ça dépend du navigateur, du proxy et de la configuration du php.ini. Bonjour la complexité !
Sur mon serveur le paramètre du php.ini qui fait que ça s’affiche seulement à la fin ou pas c’est :; Implicit flush tells PHP to tell the output layer to flush itself
; automatically after every output block. This is equivalent to calling the
; PHP function flush() after each and every call to print() or echo() and each
; and every HTML block. Turning this option on has serious performance
; implications and is generally recommended for debugging purposes only.
implicit_flush = Off
Et si vous ajoutez flush(); (ou autre fonction du même genre) dans la boucle vue précédemment vous forcerez l’affichage, même si la config PHP dit le contraire.
Je me demandais s’il était facile d’implémenter un petit script qui fasse apparaitre une barre de progression pour suivre l’évolution ? Là je mets des petits points mais ça pourrait être plus joli B)
Ben suffit de reprendre mon script plus haut… Et en javascript tu mets un div imbriqué, avec une taille qui varie de 0 a 100% de la taille du div parent, pi tu y mets un background et c’est la fete \o/
Allez, chu gentil today…
A débugger, m’enfin ca doit vraiment pas etre loin de la réalité…
Suffit juste d’implémenter le contenu de ta boucle, et le calcul de ton pourcentage effectué =)
[code]
0%
<?php
while ($condition) {
// [-- ton code --]
// tu fais ton calcul de pourcentage
$pourcent = ($x*$y)/$z;
// tu mets ton script dans le buffer de sortie
echo "\n"."";
// tu output le buffer de sortie => execution du javascript => modification de la barre de progression
ob_flush();
flush();
}[/code]