Aller au contenu

Traitement php et pause café


xpatval

Sujets conseillés

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 ... :whistling:

xpatval

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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 :nono: )...

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é par TheRec
Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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é par TheRec
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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...).

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Comment intégrer un traitement dans la classe pour laquelle vous avez donné le lien ?

<?php
include("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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...