ob_start/ob_end_flush lors d'appel de fonctions externes

Eléphant du PHP | 67 Messages

06 mai 2008, 13:28

Je développe un site intranet, et utilise la mise en buffer via ob_start. jusqu'a maintenant je laissait le serveur se charger de faire le ob_end_flush lui même (ce qui marchait tres bien). Depuis que j'ajoute dans mon code des fonctions provenant d'une classe différente de celle ou le ob_start est réalisé je suis forcé de faire mon ob_end_flush moi même. Ca marche toutjours mais j'aimerai savoir pourquoi ...
J'ai peur que le probleme vienne du fait que le fait d'appeller des fonction externes a la classe créée des probleme dans la mise en buffer des informations.

Si quelqu'un peu m'en dire un peu plus sur les condition nécessaire pour que le navigateur fasse seul le ob_end_flush (ou les erreur possible qui lempecherai de le faire).
Modifié en dernier par vince_weed le 06 mai 2008, 15:22, modifié 1 fois.

ViPHP
ViPHP | 4039 Messages

06 mai 2008, 14:28

ob_start est déclaré dans une classe ? on peu avoir un aperçu du code ?

Petite mise au point cependant, ce n'est pas le navigateur qui s'occupe de tout ça, c'est le serveur lui-même.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 67 Messages

06 mai 2008, 15:37

1) désolé pour le lapsus (j'ai édité mon premier post)

2) Ensuite pour etre plus précis:

j'ai en effet une classe template.class.php contenant une classe Templateavec certaine fonctions nécessaires a mon "template".
        /**
	 * Méthode démarrant la bufferisation
	 * @access private
	 */
	function debutBuffer()
                {
		ob_start(array(&$this, 'flushBuffer'));
                }
Puis dans mon fichier template.ini.php, j'instancie la classe précédement cité et utilise cette methode

si plus de code ou de détails sont nécessaires demandez moi ;)
Modifié en dernier par vince_weed le 09 mai 2008, 15:14, modifié 1 fois.

ViPHP
ViPHP | 4039 Messages

06 mai 2008, 16:22

Tu es sur de ne pas avoir une sortie du tampon (buffer) quelque part ? genre dans le destructeur de la classe ?

Au fait, pourquoi il y a un tableau dans le paramètre de ob_start ? ob_start ne prends que des chaines comme paramêtre (c'est ce qu'en dit la doc en tout cas), j'imagine bien ce que ça pourrait faire, mais je me demande comment il le pourrait..

Sinon, le tampon se vide soit quand ob_end_flush est appelé, soit à la fin du script, il faudrait donc voir ce que tu appliques comme changement.. peut-être que le tampon est appellé deux fois, et du coup il faut le vider autant de fois qu'il y en a d'ouvert..
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 67 Messages

06 mai 2008, 16:52

en effet ob_start ne prends que des chaines comme paramêtre (selon la doc) mais (petite astuce) l'utilisation d'un tableau permet de faire appel a un callback contenu dans un objet.

Sinon pour ce qui est de mon problème, j'ai verifié il n'est appelé qu'une fois et pas de sortie hasardeuse non plus. Après plus de recherche il semblerai que les objets des classes différente de celle gérant le callback soit détruit juste avant la fin du script (avant que le tampon ne se vide) ce qui expliquerai pourquoi ma téthode externe n'est pas prise en compte.

De plus je passe par un singleton plustot que par une simple instanciation tout se déroule bien.

mais ce n'est pas tres clair donc si qqn en sait plus..


PS: au cas ou je rajoute
- l'appel des fonctions:
// Titre de la page 
			$this->assign('MetaTitrePage', $this->titrePage);

		// Message (à placer avant les entêtes HTML)
			$this->assign('MessageTemplate', $messageTemplate-                                                                                                                   >construireHTML());
		
		// Entetes additionnelles
			$this->assign('ExtraHeaders', $this->extraHeaders);
		
		// Boutons d'action
			$this->assign('ActionsSurLaPage', $this->buildActions());
			
		// Balise body
			if($this->extraBody!==''){
				$this->assign('ExtraBody', ' onload="'.$this->                                                                                                                     >extraBody.'"');	
			}
			else{
				$this->assign('extraBody', '');	
			}
		
		// Chamins de fer
			$this->assign('CheminDeFer', $this->cdf->construireHTML());
		
-la fonction assign:
 */
	function assign($champs, $valeur){
		$this->valeursTemplate[$champs]=$valeur;
	}
Modifié en dernier par vince_weed le 09 mai 2008, 15:15, modifié 2 fois.

ViPHP
ViPHP | 4039 Messages

06 mai 2008, 19:28

(note: y'a des tags
 pour avoir du code php joliment coloré)

hrmm.. Quand tu dis [i]'(...)j'ajoute dans mon code des fonctions provenant d'une classe différente de celle ou le ob_start (...)'[/i], je vois pas trop ce que ça pourrait causer, en réalité.. tu développes uniquement en objet ? Et si tu désactives la tampon (sans le ob_start) ?

Sans voir vraiment de quoi il pourrait s'agir (sans avoir le code sous les yeux), je mettrais des ob_get_level() et un ob_list_handler(), pour voir un peu ce qui se passe.

Sinon il faudra attendre que quelqu'un qui a déjà été confronté à ce genre de cas se fasse entendre..
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 67 Messages

07 mai 2008, 09:57

En effet presque la totalité du site est developpé en objet et la façon dont les pages se construisent nécessite obligatoirement une mise en buffer.

Je te remerci d'avoir essayé d'éclairé ma lanterne et commprend aisément que sans la totalité du code il soit difficile de cerner le probleme. J vais me pencher sur le ob_list que je ne connaissait pas

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

07 mai 2008, 10:28

Modération :
vince_weed, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 4674 Messages

08 mai 2008, 00:05

Hey :),

Juste par curiosité, tu utilises PHP 5 non (déduction faite du salon dans lequel nous nous trouvons) ? Donc :
/** 
 * Méthode démarrant la bufferisation 
 * @access private 
 */ 
function debutBuffer() 
{ 
    ob_start(array(&$this, 'flushBuffer')); 
}
c'est pas beau et c'est du PHP 4 Monsieur ;-).
Je propose une nouvelle version :
/**
 * Méthode démarrant la temporisation.
 * @access  private
 * @return  void
 */
private function debutBuffer ( ) {

    ob_start(array($this, 'flushBuffer'));
}
C'est juste une petite amélioration :).

Une autre astuce en complément de celle proposée par Berzemus : place des echos dans les différents destructeurs de tes objets et regarde ce que le tampon a mémorisé. Tu pourras retracer l'exécution du script et ainsi trouver ce que tu cherches.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 67 Messages

09 mai 2008, 15:32

Et oui c'est pas très beau je le confesse...

En fait je suis stagiaire dans le secteur informatique d'une grande banque et reprend un intranet déja tès conséquent environ 200 page de code. Or bien que nous soyons passé a PHP5 les premiers développements se sont fait en PHP4 et je n'ai pas le temps de tout mettre au goût du jour...
mais merci pour la remarque :wink:

sinon pour ce qui est de ma question première àpres recherche plus approfondie j'ai validé mon sentiment premier depuis PHP5 (correctif de bug je ne sait plus combien) le destructeur de objets est appellé juste à la fin du script avant le flush.

Remarque:
(Le passage pas singleton permettant de contourner le probleme puisque la variable contenant l'objet singletonné (je sais que ce mot n'existe pas..) joue le role de référence vers l'objet et ne contient donc pas physiquement de donnée.

PS: ca y est j'ai mis de zoli tags pour mon PHP 8-)