xpatval Posté 16 Septembre 2005 Posté 16 Septembre 2005 Bonjour, fin d'après pourrie, Une question qui me traversu l'esprit: lors de l'exécution d'un script php, dont le temps de traitement est relativement long, est-il possible, toujours en php, d'associer une sorte de barre d'attente (un peu dans le même ordre que celles existantes lors d'un téléchargement de fichier, par exemple) ? Je ne sais si je me suis fait comprenu ... xpatval
rportal Posté 16 Septembre 2005 Posté 16 Septembre 2005 je crois qu'il existe une fonction en PHP5 pour ca...
Boo2M0rs0 Posté 16 Septembre 2005 Posté 16 Septembre 2005 Je pense qu'on peut bricoler ça. L'astuce est qu'il faut envoyer du code html pour ralonger à intervalle régulier la barre de progression. Pour cela, une commande flush(); en php juste après chaque bout de html envoyé permettra d'afficher le code avant la fin du chargement de la page (elle est encore en chargement quand elle s'execute). Il faut aussi que le serveur soit reglé comme il faut, c'est à dire pas de mise en cache de la page.
TheRec Posté 16 Septembre 2005 Posté 16 Septembre 2005 (modifié) Bonjour, je ne l'ai pas testé, mais la méthode évoquée et montrée sur ce billet me semble intéressante. Apparemment l'aueur s'est basé sur une class existante ... Pour ceux qui ne parlerait pas anglais, le seul problème apparemment se présente lorsque la barre de chargement est dans une cellule d'une table sous Internet Explorer (le flush n'est pas autorisé par IE dans ce cas )... Je n'ai pas testé cette solution (à part l'exemple dans le billet)... **Edit** Ceci est un traitement côté client... j'ai de la peine à imaginer le traîtement côté serveur sans redirection, HTTP étant stateless... Modifié 16 Septembre 2005 par TheRec
Boo2M0rs0 Posté 16 Septembre 2005 Posté 16 Septembre 2005 (modifié) J'ai essayé cela vite fait: Aperçu Source Ca a l'avantage de fonctionner sans javascript, mais donc ça ne gère pas l'affichage d'un pourcentage, peut être que c'est faisable faut que j'y réfléchisse. Modifié 16 Septembre 2005 par Boo2M0rs0
Anonymus Posté 16 Septembre 2005 Posté 16 Septembre 2005 Expérience : Lors de l'utilisation de Phpdig, le programme (phpdig, moteur de recherche) envoie les informations au fur et à mesure du crawle d'un site... Il est bien possible d'envoyer des informations à IE, alors que le programme n'a pas fini. J'ai testé ceci avec des temps d'execution de... plusieurs heures, à une journée. (ce qui est largement suffisant). ps : le problème de dépasser un temps d'execution d'une journée tient du problème des adresses IP des FAI, et non du programme ni d'une config. serveur Anonymus.
TheRec Posté 16 Septembre 2005 Posté 16 Septembre 2005 (modifié) Il est bien possible d'envoyer des informations à IE, alors que le programme n'a pas fini. <{POST_SNAPBACK}> Selon le billet que j'ai cité (et ce que j'ai traduit déjà), le seul cas qui ne fonctionne pas dans IE c'est quand le contenu se trouve dans une cellule d'un <table> (cela vient sûrement du fait que le tableau est "rendu" une fois qu'il est complet sous IE)...Malgré cela, cette barre en Javascript n'est pas très "accessible" En PHP, le flush est une très bonne idée...mais en revanche sans Javascript il va être dur de masquer (ou envlever) la barre après avoir fini de l'utiliser... La modifiction du buffer n'est plus possible qu'un (ou plusieurs) appels à flush() auront été faits... Modifié 16 Septembre 2005 par TheRec
xpatval Posté 17 Septembre 2005 Auteur Posté 17 Septembre 2005 En fait, le traitement que je lance va s'effectuer en plusieurs étapes, automatiques. Et ce sont ces différentes étapes que je souhaiterais "marquer" par cette espèce de barre d'avancement... xpatval
xpatval Posté 17 Septembre 2005 Auteur Posté 17 Septembre 2005 J'ai essayé cela vite fait: Aperçu Source Ca a l'avantage de fonctionner sans javascript, mais donc ça ne gère pas l'affichage d'un pourcentage, peut être que c'est faisable faut que j'y réfléchisse. <{POST_SNAPBACK}> Le code source me paraît incomplet, non ? xpatval
TheRec Posté 17 Septembre 2005 Posté 17 Septembre 2005 Il faut faire "Afficher la source" pour voir le code Boo2M0rs0.
Boo2M0rs0 Posté 17 Septembre 2005 Posté 17 Septembre 2005 Oui j'ai fait ça vite fait Bref sinon, je cherche toujours comment afficher le pourcentage en me passant de javascript
TheRec Posté 17 Septembre 2005 Posté 17 Septembre 2005 Comme je l'ai dit précédemment, flush() te permet de vider le buffer de PHP, cela te donne un effet de progression. Mais PHP n'est pas capable de modifier du contenu déjà envoyé (c'est ce qui se passe avec flush), sinon il ne s'agirait pas d'un langage interprété côté serveur.
loufoque Posté 17 Septembre 2005 Posté 17 Septembre 2005 On peut aussi faire une solution 100% JavaScript, mais du coup impossible de fournir un pourcentage car on ne saura pas quand ça finira.
destroyedlolo Posté 17 Septembre 2005 Posté 17 Septembre 2005 La solution artillerie lourde consiste a : - lance le processus en tache de font - faire qu'il indique dans un fichier (ou une zone de memoire partagee) le pourcentage, - afficher une page qui se raffraichie toutes les X secondes et qui affiche ce poucentage ... Variante plus jolie : au lieu que la page entiere se rafraichisse, utiliser un javascript qui raffraichie uniquement une image generee a la vollee en fonction du %. C'est clair que c'est lourd, mais ca fonctionne tres bien et c'est assez facile a mettre en place.
xpatval Posté 17 Septembre 2005 Auteur Posté 17 Septembre 2005 Bonjour, je ne l'ai pas testé, mais la méthode évoquée et montrée sur ce billet me semble intéressante. Apparemment l'aueur s'est basé sur une class existante ... Je n'ai pas trouvé la classe, dans sa liste... xpatval
TheRec Posté 17 Septembre 2005 Posté 17 Septembre 2005 Je pense que c'est de celle là dont il parle : http://www.phpclasses.org/browse/package/1554.html Il faut être identifié pour consulté... et donc s'inscrire ! Concernant la solution de destroyedlolo, le fichier en question devra être unique et le rafraîchissement pourra causer de serieux problèmes si le temps de chargement de la page est "long" (le pourcentage aura sûrement évolué, voir être "fini", lorsque la page est chargée...), ensuite le process en tâche de fond ça me parait possible, mais sur un hébergement mutualisé tu oublies vite fait Mais la plus grosse contrainte sera la gestion côté "multi-utilisateurs", si plusieurs visiteurs utilisent la barre de défilement il leur faut à chacun un fichier (ou une zone commune, une session serait envisageable...).
destroyedlolo Posté 17 Septembre 2005 Posté 17 Septembre 2005 Concernant la solution de destroyedlolo, le fichier en question devra être unique et le rafraîchissement pourra causer de serieux problèmes si le temps de chargement de la page est "long" (le pourcentage aura sûrement évolué, voir être "fini", lorsque la page est chargée...), ensuite le process en tâche de fond ça me parait possible, mais sur un hébergement mutualisé tu oublies vite fait Par forcement, il suffit que le process tache de font genere une image. Ensuite, dans ta page, tu fais un <IMG> dont la source est ton fichier a execute en tache de fond. En resume ca done : * un IMG qui lance le script tache de font - ce script cree une zone de memoire partagee au nom unique - il y place regulierement son %age d'avancement, * un javascript lance par un 'onload()' qui lance un autre IMG contenant la barre d'avancement - elle prend le %age de la memoire partagee Ma seule interrogation est de savoir si le 'onload()' est lance quant la page a fini de s'affichee ou avant ...
TheRec Posté 17 Septembre 2005 Posté 17 Septembre 2005 Le problème est que le chargement des éléments dans une page ne se fait pas dans le mêdme ordre par tous les navigateurs et il faudra également gérer le cache... Je ne dis pas que ce n'est pas possible, je dis juste que beaucoup de paramètres entrent en ligne de compte... En tout cas ce serait intéressant dfe voir une solution qui fonctionne, mais comme je l'ai dit, ce n'est à mon avis pas possible de le faire SANS Javascript...
xpatval Posté 18 Septembre 2005 Auteur Posté 18 Septembre 2005 Comment intégrer un traitement dans la classe pour laquelle vous avez donné le lien ? <?phpinclude("class.progress_bar.php");$pbar = new progress_bar('pbar',1,500,FALSE); //Creates a 500 pixle width progress bar starting at 1 percent with the name pbar auto create = false$num_tasks = 10000; // the number of tasks to be completed.$pbar->create(); // Visually creates the progress bar.for($cur_task = 0; $cur_task <= $num_tasks; $cur_task++){ echo("<p>Task $cur_task complete.</p>"); // Execute the current task. usleep(10000); // delays exicution 10000 microseconds to show effect of progression. flush(); $pbar->set_percent_adv($cur_task,$num_tasks); // tells the progress bar that $cur_task of the 500 tasks is completed.}?> Ou dois-je mettre mon script ? xpaval
loufoque Posté 19 Septembre 2005 Posté 19 Septembre 2005 ensuite le process en tâche de fond ça me parait possible, mais sur un hébergement mutualisé tu oublies vite fait Tous les hergements mutualisés ne désactivent pas popen et/ou proc_open. Certains hebergements proposent même de faire un pcntl_fork.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant