IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Bufferisation avec php et header()


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 300
    Par défaut Bufferisation avec php et header()
    Bonsoir,

    j'ai un problème que je n'arrive pas à résoudre un problème avec l'utilisation de la bufferisation et l'envoi d'entête.

    Voici en gros le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
        ob_start();  // demarrage de la bufferisation
     
        // traitement des données, etc...
     
        $donnees = ob_get_contents();  // recupération des données du buffer
        ob_end_clean();  // vidage du buffer
     
        // autre traitement
     
        si(erreur)
        {
            header("",true,500);
            exit('message d\'erreur !')
        }
    Le problème est que lorsque j'utilise la bufferisation l'entête ne prend pas...
    Comment faire pour utiliser la bufferisation tout en pouvant envoyer derrière l'entête souhaitée...?

    En espérant que quelqu'un pourra m'aider.

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Il faut bien comprendre que header() ne fait rien d'autre qu'envoyer des données au navigateur. Si tu bufferises la sortie, les données transmises par header() sont mises en buffer. Si tu ne libères pas ce buffer, tu n'enverras pas ces données.

    Voilà voilà.
    Il faut que tu appelles ob_end_flush() avant ou après l'appel à header().

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 300
    Par défaut
    Mais le problème de ob_end_flush(), c'est qu'il renvoit son contenu au navigateur et ensuite il vide le buffer. Et le problème c'est que je ne souhaite pas tout de suite envoyer le contenu, je souhaite le récupérer dans une variable pour ensuite seulement l'envoyer.

    Dans l'exemple (code ci-dessus) le header() n'est pas dans la bufferisation..

    Merci de ton aide rapide, c'est très appréciable.

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    *ahem*

    Oui, désolé, j'ai lu ton message un peu rapidement...

    Voici le code (qui fonctionne, après corrections) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        ob_start();  // demarrage de la bufferisation
     
        // traitement des données, etc...
     
        $donnees = ob_get_contents();  // recupération des données du buffer
        ob_end_clean();  // vidage du buffer
     
        // autre traitement
     
        if(empty($erreur))
        {
            header("Location: http://<a href="http://www.developpez.com/");" target="_blank">www.developpez.com/");</a>
            exit;
        }

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 300
    Par défaut
    Le changement fait est bien :
    header("Location: http://www.developpez.com/");

    Mais le problème est que je souhaite envoyer une entête pour indiquer par exemple un code erreur...en l'occurence un 404 ou 500 lors d'un problème de traitement précédent. Et cela ne prend pas...

    A moins que j'ai loupé quelque chose ?!

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Cela prend très certainement, c'est ce que j'ai voulu te démontrer avec cette modification. Le truc est que les headers ne sont pas affichés dans le navigateur. Tu peux utiliser fopen() ou file_get_contents() pour lire la page brute, si tu le souhaites. Je suis à peu près persuadé que tu y retrouveras ton header.

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 300
    Par défaut
    ah ok.....
    donc depuis tout ce temps ça fonctionnait !!!

    Mais bizarre tout de même, quand je met le header devant tout ça, je vois bien l'entete (firefox + web developper).

    Parce que c'est supper important que les entetes soit bonne, surtout si un robot passe, s'il voit le code 200 (page ok) comme moi, alors que c'est l'affichage du message d'erreur.

    Tout s'appuit la dessus.
    Peux tu me confirmer avec certitude que c'est fonctionnel ainsi ?

    EDIT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      if(headers_sent()) echo '<br />ENTETE ENVOYEE 1<br />';
      header("HTTP/1.1 404 Not Found", true, 404);
      if(headers_sent()) echo '<br />ENTETE ENVOYEE 2<br />';
    Il ne détecte aucune sortie d'entête...
    ni avant, ni après...

  8. #8
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Oui, je pense que ça fonctionnait depuis le début ^^

    Je pense savoir pourquoi headers_sent() ne retourne pas ce que tu crois qu'il retourne : il arrête de retourner FALSE quand le bloc de headers est envoyé, pas quand au moins un header est envoyé. Je pense que la nuance est dans le terme "envoyer".

    Tu envoies réellement les headers quand le navigateur les a reçus, pas quand tu as demandé à PHP de les envoyer. Souviens-toi aussi qu'il y a une temporisation systématique opérée par PHP : les infos ne sont pas envoyées immédiatement, elles sont conservées un peu en cache.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
     
    if(headers_sent() !== FALSE) echo '<br />ENTETE ENVOYEE 1<br />';
     
    header('HTTP/1.1 404 Not Found', FALSE, 404);
     
    echo 'bouh';
     
    if(headers_sent($file, $line) !== FALSE) echo '<br />ENTETE ENVOYEE 2<br />in '.$file.' on line '.$line;
     
    ?>

  9. #9
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 300
    Par défaut
    J'ai fait le test avec fopen() rapidement :
    Warning: fopen(http://127.0.0.1/index.php): failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error in *****\test.php on line 4
    En effet il me retourne bien l'entête souhaitée.
    Mais comment ce fait-il que mon navigateur ne voit pas cette erreur, alors que sans l'utilisation de la bufferisation, il detecte bien les entêtes envoyées.
    J'ai du mal à comprendre, et je me dis que si mon navigateur ne m'indique pas l'entête que je lui envoie, il en sera de même si un robot passe et tombe sur ce type de cas.

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 300
    Par défaut
    Vous n'allez pas le croire...

    J'ai redémarré mon poste, et refais le test....
    Super mon navigateur me detecte enfin les entêtes modifiées !!!!
    pfff...les mystères de l'informatique...

    Merci de votre aide.

    E D I T : ...et je n'ai abslument rien changé entre temps dans mon code.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Connexion à Firebird avec PHP
    Par genova dans le forum Connexion aux bases de données
    Réponses: 7
    Dernier message: 12/09/2006, 17h48
  2. Travailler avec PHP / Apache / MySQL
    Par R3iTt0R dans le forum Linux
    Réponses: 22
    Dernier message: 24/06/2004, 11h03
  3. [débutant] choix de postgre avec php / migration
    Par bilbon.S dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 23/03/2004, 14h05
  4. Création d'utilisateur sous PostgreSQL 7.3.2 avec PHP
    Par duongkhang dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 06/06/2003, 13h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo