[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
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
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
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 :
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 ...
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
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é) :
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; }
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
17 août 2009 à 12:15
Tu es génial, merci beaucoup...
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
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 );
}
ob_start( 'tafonction' );
function tafonction( $buffer, $mode )
{
traitement---(modification du buffer)
return $ob_gzhandler( $buffer, $mode );
}
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
18 août 2009 à 07:41
Tout dépend de ce que tu fait comme traitement ...
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
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.
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
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
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 ...
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 ...
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
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)
<?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)
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
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é.
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é.
16 août 2009 à 22:56
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...