Page 1 sur 1

Output avant Header

Posté : 05 juil. 2007, 11:12
par Rei Itchido
Bonjour à tous,

Je viens de remarquer qqchose qui me perturbe un peu :)

Logiquement, rien ne doit être envoyé au browser avant un header sous peine d'avoir un beau
Cannot modify header information - headers already sent by ...
Je viens d'installer une relativement vieille version d'EasyPhp (la version 1.7 - qui contient Apache 1.3.27 avec PHP 4.3.3 - ) et qu'elle n'est pas ma surprise de pouvoir faire
<?php
echo "test";
header("Location: test.php");
?>
ou
<?php
echo "test";
session_start();
?>
En installant la dernière version d'EasyPhp (la version 1.8 avec Apache 1.3.33 et PHP 4.3.10), j'ai bien une erreur.

Je me demande ce qui fait que je n'ai pas de message d'erreur dans le 1er cas...
Une configuration spéciale d'Apache? De PHP?

Posté : 05 juil. 2007, 11:29
par Hubert Roksor
Il se pourrait que "output_buffering" soit sur "on" dans ton php.ini. Ça correspond à l'utilisation d'ob_start() et ça retarde l'envoi des données.

Posté : 05 juil. 2007, 11:56
par Rei Itchido
Ha oui effectivement.
Il était à 0 dans le 2ème et à 4096 dans le 1er.

Quelles peuvent être les inconvenients à autoriser l'output_buffering?

Posté : 05 juil. 2007, 12:49
par Hubert Roksor
Là comme ça je ne saurais pas dire, il n'y en a pas vraiment. Mais il n'y a pas vraiment non plus d'avantages donc j'aurais tendance à le laisser sur off pour "attrapper" les erreurs plus facilement.

Posté : 05 juil. 2007, 13:25
par Rei Itchido
Ok, merci Hubert :)

Posté : 05 juil. 2007, 13:36
par sadeq
Dans la doc, ceci est à lire:
Normalement, les données de session, de cookie ou d'en-tête HTTP (header) dans un script PHP doivent être envoyées avant que le script ne génère une quelconque sortie (echo, print, include HTML, bloc HTML,...). Si cela n'est pas possible dans votre application, vous pouvez activer ce que PHP appelle la "bufférisation de sortie", à l'aide de la variable output_buffering.

Lorsque la "bufférisation" de sortie est activée, PHP stocke le résultat de votre script dans une mémoire tampon spécifique et ne l'envoie que lorsqu'il en reçoit explicitement l'instruction. Cela vous permet d'envoyer des en-têtes HTTP et des données de cookie même au milieu ou à la fin de votre script. Sachez toutefois que cette technique diminue légèrement les performances.
output_buffering = Off

Source: http://www.zdnet.fr/builder/programmati ... 790,00.htm

Posté : 05 juil. 2007, 13:45
par Rei Itchido
Ok merci pour ces infos.