[PHP] Appel fonctions avec ob_start()

Résolu/Fermé
deterralba Messages postés 29 Date d'inscription mercredi 1 juillet 2009 Statut Membre Dernière intervention 17 juin 2010 - 16 août 2009 à 12:52
imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 - 19 août 2009 à 08:04
Bonjour,

Je voudrais savoir comment appeler deux fonction en callback, c-à-d dans mon cas, ob_gzhandler et une autre fonction (que j 'ai créée) lors de la temporisation avec ob_start().
Actuellement j'utilise ob_start('ob_gzhandler '), je voudrais obtenir ob_start('ob_gzhandler + maFonction')

Merci

7 réponses

imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 42
16 août 2009 à 17:16
A priori, tu ne peux appeler qu'une seule fonction.

Mais tu doit pouvoir faire juste un appel à ta fonction :

ob_start( 'tafonction' );

function tafonction( $buffer )
{
    $buffer = ob_gzhandler( $buffer );

    ...
    ton traitement
    ...

    return $buffer;
}


Comme ça tu a exéctuer d'abord ob_gzhandler, puis ta fonction ...
0
deterralba Messages postés 29 Date d'inscription mercredi 1 juillet 2009 Statut Membre Dernière intervention 17 juin 2010 16
16 août 2009 à 22:56
J'ai simplement essayé :

ob_start('tafonction');
function tafonction($buffer)
{ $buffer = ob_gzhandler($buffer);
return $buffer;}

mais la page chargée est vide (buffer vide donc), pourtant, lorsque j'utilise ob_start('ob_gzhandler'); tout marche bien... As testé ton code ? Une piste...
0
imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 42
17 août 2009 à 08:10
Désolé, je n'avais pas testé ...
Je suis juste parti de la doc.
https://www.php.net/manual/fr/function.ob-start.php

Après un petit test il s'avère qu'il y a un paramêtre MODE qu'il faut passer sinon ça foire. Par contre, aucune info sur ce paramêtre en question.

Ca donne donc (et j'ai testé) :

ob_start( 'tafonction' );
function tafonction( $buffer, $mode )
{
    $buffer = ob_gzhandler( $buffer, $mode );
    ...
    ton traitement
    ...
    return $buffer;
}
0
deterralba Messages postés 29 Date d'inscription mercredi 1 juillet 2009 Statut Membre Dernière intervention 17 juin 2010 16
17 août 2009 à 12:15
Tu es génial, merci beaucoup...
0
deterralba Messages postés 29 Date d'inscription mercredi 1 juillet 2009 Statut Membre Dernière intervention 17 juin 2010 16
17 août 2009 à 23:00
Juste une petite remarque, il faut d'abord effectuer le traitement et ensuite appeler ob_gzhandler, ce qui donne :
ob_start( 'tafonction' );
function tafonction( $buffer, $mode )
{
traitement---(modification du buffer)
return $ob_gzhandler( $buffer, $mode );
}
0
imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 42
18 août 2009 à 07:41
Tout dépend de ce que tu fait comme traitement ...
0
deterralba Messages postés 29 Date d'inscription mercredi 1 juillet 2009 Statut Membre Dernière intervention 17 juin 2010 16 > imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011
18 août 2009 à 18:34
C'est justement de là qu'un problème est arrivé :
J'ai compressé mon $buffer avec une fonction qui modifie également le $buffer avant sa compression. Jusqu'ici aucun problèmes.
Mais lorsque je veut extraire grâce à une RegEx une partie du $buffer après sa compression (grâce à ob_get_contents), la RegEx ne fonctionne pas (à mon avis, le code est déjà compressé et donc illisible, car quand je désactive ob_gzhanler (la compression), la RegEx fonctionne).

Exemple:

maFonction($buffer, $mode)
{    traitement $buffer ---
     return ob_gzhandler($buffer, $mode);}

ob_start('maFonction');

$content = ob_get_content();
Application d'une regex à $content -> résultat vide (qui est bon lorsqu'il n'y a pas gz_handler)

ob_end_flush();

Je crains malheureusement qu'il n'y ai pas de solution aujourd'hui... Il faudrait décompresser $content, soit j'ai la compression, soit j'ai ob_get_content...

Help.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 42
18 août 2009 à 22:10
Je suis pas sur d'avoir bien compris ou tu voulais en venir ...

Plutôt que de te prendre la tête avec du contenu compressé, pas compressé ... pourquoi ne compresse tu pas le tout à la fin ?

echo gz_handler( ob_get_flush() );

et tu abandonne le gz_handler dans la fonction du ob_start ...

Comme ça, tu es sur de ne pas avoir le code compressé avant l'envoi ...

Autre chose, pourquoi veux-tu absolument compresser à la main ???? la plupart des serveurs Web, notamment apache savent le faire à la volée, sur le code fini ...
0
deterralba Messages postés 29 Date d'inscription mercredi 1 juillet 2009 Statut Membre Dernière intervention 17 juin 2010 16
19 août 2009 à 01:18
J'ai essayé ceci :

<?php ob_start();?>
code xHtml---
<?php ob_gzhandler(ob_get_contents(),$mode);?>

Mais il n'y a pas de compression : ob_get_contents() (tout comme ob_enf_flush) n'est pas équivalent à $buffer : "ob_gzhandler() est destinée à être utilisée comme fonction de rappel par ob_start()" (doc php.net) je pense que lorsque ob_gz_handler n'est pas en callback, elle ne marche pas...

Comment compresse t on avec apache ? (.htaccess ?)
(j'ai trouvé ça : http://httpd.apache.org/docs/2.0/mod/mod_deflate.html est ce bon ? Je n'ai pas acces au php.ini ni au httpd.conf)
0
imw Messages postés 233 Date d'inscription vendredi 17 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 42
19 août 2009 à 08:04
Ca devrai fonctionner ...

Si, ob_get_flush() te renvoi le même contenu que le $buffer que tu as dans la fonction start ... et qui n'est pas compressé.

Pour la méthode ob_gzhandler, il faut lui passer un 2eme paramêtre (5 en général ... pas très documenté, a priori, ce serai le taux de compression)

echo gz_handler( ob_get_flush(),5 );
devrai fonctionner ...

ob_gzhandler() peut être appelé de n'importe où ! pas de restriction. Par contre, attention, elle modifie les headers si elle compresse.

Pour ce qui est du mod deflate, c'est bien ça. Je viens de faire l'essai sur un apache de test, et il suffit d'activer le mod_deflate pour qu'il compresse tout ce qu'il peut à la volée.
Mais si tu n'a pas d'accès au conf d'apache, tu ne pourra rien y changer ... juste à vérifier si il n'est pas déjà activé.
0