[PHP] Appel fonctions avec ob_start()
Résolu
deterralba
Messages postés
29
Date d'inscription
Statut
Membre
Dernière intervention
-
imw Messages postés 233 Date d'inscription Statut Membre Dernière intervention -
imw Messages postés 233 Date d'inscription Statut Membre Dernière intervention -
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
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
A priori, tu ne peux appeler qu'une seule fonction.
Mais tu doit pouvoir faire juste un appel à ta fonction :
Comme ça tu a exéctuer d'abord ob_gzhandler, puis ta 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 ...
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é) :
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; }
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 );
}
ob_start( 'tafonction' );
function tafonction( $buffer, $mode )
{
traitement---(modification du buffer)
return $ob_gzhandler( $buffer, $mode );
}
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ...
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 ...
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)
<?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)
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é.
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é.
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...