livraison de la page avant fin de moulinage script

Uld
Invité n'ayant pas de compte PHPfrance

04 sept. 2008, 11:42

Bonjour,

je suis confronté à un problème pas commode, je vais tenter de l'expliquer...

Admettons un script foo.php qui délivre une page web html. Ce script fais appel à un base MySQL pour récuperer diverses info, prépare la page et apache sert ensuite la page à l'internaute.

Mon soucis c'est qu'une fois que le script à fait les calculs nécessaire pour délivrer une page personnalisé à l'internaute, il termine en faisant divers autres calculs (assez longs) mais qui ne sont pas utiles pour la page en elle même (grosso modo il fait diverses modifications dans la base, ajouts de statistique, et autres calculs).

Tous ces calculs secondaires ne sont pas nécessaire pour délivrer la page, et son fait en tout fin de script, après la balise </html>

Mon soucis c'est qu'il semblerait que la page ne soit pas envoyée au navigateur tant que l'execution complète du script n'est pas finie... Et donc l'internaute poireaute pendant un temps trop long.


Est il possible d'avoir le comportement suivant:

1 -Appel de la page foo.php
2 -Calcul de la page personnalisée par PHP
3 -Livraison de la page
4 -Autres calculs divers
5 -Fin d'appel au script foo.php

L'idéal serait que l'étape 3 permette à l'utilisateur de visualiser la page demandée sans que le moulinage de l'étape 4 ne l'impacte.


Merci par avance pour les pistes que vous pourrez m'indiquer.

Uld

Eléphant du PHP | 185 Messages

04 sept. 2008, 11:48

Essaie en faisant ob_flush() après ton </html> (ou ob_end_flush() ).

ViPHP
ViPHP | 4039 Messages

04 sept. 2008, 11:51

Il suffit de jouer avec le tampon d'affichage: voir ob_Start()

Sinon est-ce que tu ne peux pas provoquer ces calculs dans un script séparé, avec un cron, par exemple ? (le pendant des tâches planifiées de windows, mais pour *nix)

Ou bien tu pourrais chercher d'ou viennent ces délais de calcul, parce qu'a moins de vouloir recalculer pi avec une précision de quelques milliers de chiffres après la virgule, je ne vois pas ce qui pourrais te prendre tellement de temps pour que le visiteur parte se trouver un café..
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Invité
Invité n'ayant pas de compte PHPfrance

04 sept. 2008, 12:32

Ok j'vais me pencher sur ces histoire de buffer d'affichage.

Non j'ai pas franchement envie d'utiliser un cron. C'est un script du jeu que je développe (arkhan) et qui fait jouer l'IA. Le but c'est que ce soit justement les actions des joueurs qui fassent jouer l'IA, histoire que si un jour le jeu plante pour une raison lambda (surcharge, plantage, autres) l'IA ne continue pas à jouer toute seule.

Et non je ne recalcul pas PI, je fais juste jouer quelques centaines de monstres (donc appel de classe, requêtes dans la base etc)

Merci pour la piste.

Eléphanteau du PHP | 35 Messages

04 sept. 2008, 13:34

Et si à la fin de ta page tu envoie une requête AJAX vers une autre page PHP qui ferait les calculs.

Cela semblerait être le mieux.

Eléphanteau du PHP | 36 Messages

04 sept. 2008, 14:05

Buffer de sortie ou alors register_shutdown_function()
Julien Pauli - Formateur pôle PHP ZendFramework chez Anaska
Contributeur au projet Zend Framework
Ma page de tutoriaux, mon blog

Invité
Invité n'ayant pas de compte PHPfrance

04 sept. 2008, 14:10

Et si à la fin de ta page tu envoie une requête AJAX vers une autre page PHP qui ferait les calculs.

Cela semblerait être le mieux.
Bah le soucis si on utilise Ajax c'est que n'importe quel joueur mal veillant pourra faire jouer l'IA en envoyant les bons paramètre en GET vers l'url du script Ajaxifié....

A moins qu'il y a ait un moyen de sécuriser ca, mais là j'le vois pas.

Eléphanteau du PHP | 35 Messages

04 sept. 2008, 14:15

Et si tu fais passer les info en POST et que dans ton fichier PHP distant tu vérifie d'où viennent les informations cela ne marche pas ?

ViPHP
ViPHP | 5924 Messages

04 sept. 2008, 14:28

Buffer de sortie ou alors register_shutdown_function()
Euh,
Depuis PHP 4.1, les fonctions d'extinction sont appelées comme une partie de la requête