Output avant Header

Eléphant du PHP | 396 Messages

05 juil. 2007, 11:12

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?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

05 juil. 2007, 11:29

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.

Eléphant du PHP | 396 Messages

05 juil. 2007, 11:56

Ha oui effectivement.
Il était à 0 dans le 2ème et à 4096 dans le 1er.

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

05 juil. 2007, 12:49

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.

Eléphant du PHP | 396 Messages

05 juil. 2007, 13:25

Ok, merci Hubert :)

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

05 juil. 2007, 13:36

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
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 396 Messages

05 juil. 2007, 13:45

Ok merci pour ces infos.