[php] Grande boucle

Bonjour,

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=“olivarius, post:1, topic: 32595”]Bonjour,

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]

y’a moyen de trouver avec du javascript et du xmlhttprequest à mon avis … http://zamov.online.fr/EXHTML/DHTML/DHTML_482819.html

[quote=“olivarius, post:1, topic: 32595”]Bonjour,

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)

Antoine

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=“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

mais c’est crade aussi

Bussiere

[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”.

[quote=“Moe, post:6, topic: 32595”]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”.[/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 …

Ca aurait été bien mais chez moi ca n’affiche pas tout au fur et à mesure mais d’un seul coup à la fin…

Intéressant … chez moi ça marche. Peut-être une question de configuration Apache ou PHP …

http://www.php.net/manual/fr/control-structures.declare.php

http://fr2.php.net/manual/fr/function.flush.php

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]

Ici au taff (derrière un zoli proxy) ça marche pas, j’ai tout qui s’affiche d’un coup B)

FF 2.0 : Ca affiche au fur et a mesure
IE 6.0 : Ca affiche tout d’un coup.

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.

Oui Merci !
Le flush marche parfaitement !

(solution donnée 5 posts au dessus quand même B))

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]

Honte sur moi. C’est vrai que tu avais déjà tout dis. Je regarde ça de plus près et je te redemande si ça coince.

Merci B)