Page 1 sur 2

error_reporting

Posté : 23 janv. 2006, 17:30
par Rei Itchido
Bonjour à tous,

J'ai easyphp 1.7 d'installé pour tester des scripts en local.
J'ai passé l'error_reporting à E_ALL et j'arrive pourtant à faire par exemple :

Code : Tout sélectionner

echo "test"; header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
sans n'avoir aucune alerte.

Est-ce normal?

Posté : 23 janv. 2006, 17:44
par Number
Je penses que Oui, Moi non plus je n'ai aucune erreur ....

Posté : 23 janv. 2006, 18:03
par Rei Itchido
Me suis gourré de code...C'est quand les vacances? :x

Ce qui m'etonne en ne donnant aucune alerte c'est ça plutot :

Code : Tout sélectionner

echo "test"; session_start();

Posté : 24 janv. 2006, 00:26
par Cyrano
Que le error_reporting soit à E_ALL ne servira à rien si la directive display_error est à OFF : à vérifier ;)

Posté : 24 janv. 2006, 00:30
par Rei Itchido
Elle est à "on" aussi :?
On est bien d'accord que ce n'est pas normal que rien ne s'affiche?

Posté : 24 janv. 2006, 00:32
par Cyrano
Si tu as modifié les directives, as-tu relancé Apache pour que les nouveaux paramètres soient pris en compte ?

Posté : 24 janv. 2006, 00:35
par Rei Itchido
Oui, relancé plus d'une fois ^^

Bon et bien ça doit pas venir du serveur mais de mon code (j'inclus des fichiers en amont) où quelque chose doit m'echapper.

Merci pour vos réponses en tout cas.

Posté : 24 janv. 2006, 00:38
par Cyrano
Je ne vois pas trop : je viens de faire le test et je me fais "normalement" jeter immédiatement. :-k

Posté : 24 janv. 2006, 16:11
par Rei Itchido
Alors là, je m'arrache les cheveux...

Dans une simple page php sans rien d'autre avant ou après, voilà ce que j'arrive à faire sans avoir la moindre alerte :shock:

Code : Tout sélectionner

<?php error_reporting(E_ALL); echo error_reporting(); echo "avant > ".session_id()."<br>"; session_start(); echo "apres > ".session_id()."<br>"; ?>

Posté : 24 janv. 2006, 16:17
par Rei Itchido
Bon...

Je soupçonne la version 1.7 d'easyPHP d'être buggée. J'ai mis la 1.8 et les alertes s'affichent bien.

Posté : 24 janv. 2006, 17:13
par naholyr
Va voir dans ton php.ini les options de configuration parlant d'output_buffering. La solution y est.

Posté : 24 janv. 2006, 17:17
par Rei Itchido
J'ai desinstallé la version qui posait problème et le php.ini est parti avec.

Tu peux m'en dire plus stp?

Posté : 24 janv. 2006, 18:14
par naholyr
Roh tu m'as cassé tout mon effet du coup ><
La directive output_buffering :
; Output buffering allows you to send header lines (including cookies) even
; after you send body content, at the price of slowing PHP's output layer a
; bit. You can enable output buffering during runtime by calling the output
; buffering functions. You can also enable output buffering for all files by
; setting this directive to On. If you wish to limit the size of the buffer
; to a certain size - you can use a maximum number of bytes instead of 'On', as
; a value for this directive (e.g., output_buffering=4096).
output_buffering = Off
Quand cette directive n'est pas à "Off", l'output_buffering est automatique. C'est à dire que les entêtes HTTP et le contenu de la page ne sont envoyées que tout à la fin du script. Donc lorsque que tu fais "echo 'bidule';", les entêtes n'ont pas été envoyées, 'bidule' a simplement été ajouté au buffer, et l'appel à une fonction comme session_start() par la suite ne provoque donc pas l'erreur "headers already sent".

Dans ce cas si aucune erreur n'est affiché, c'est simplement parce qu'il n'y en a pas.

Autre conséquence de l'output-buffering : si on fait une terrible erreur de syntaxe ou autre erreur qui tue le script en cours, au lieu d'avoir l'affichage de l'erreur, on aura simplement une page blanche (voire un avertissement du navigateur "le document ne contient aucune donnée").

Posté : 24 janv. 2006, 18:55
par Rei Itchido
Merci naholyr :)

Je connaissais pas.

Juste un truc : ça met tout dans le buffer puis envoie les en-têtes avant le contenu? Ca ordonne en quelque sorte avant l'output?

Posté : 24 janv. 2006, 19:05
par naholyr
Sans output-buffering :
echo "truc"; // envoi des entêtes (content-type, etc...) + envoi de "truc".
echo "bidule"; // envoi de "bidule".
// fin du script
Avec output-buffering :
echo "truc"; // mise en buffer de "truc"
echo "bidule"; // mise en buffer de "bidule"
// fin du script + envoi des entêtes + envoi de "trucbidule"