Page 1 sur 1

PHP déclenche des erreurs 500

Posté : 29 juil. 2008, 20:44
par caroube
Bonjour,

Je suis en train de mettre en place un serveur Windows 2003/IIS 6 avec PHP en CGI/Fast CGI.
Certaines erreurs PHP, au lieu de s'afficher, provoquent une erreur 500

Par exemple, dans le code (écrit initialement en PHP 4), il y a des array_merge. Avant, il était permis de merger quelque chose qui n'est pas un tableau, maintenant c'est interdit.
Par exemple, si j'ai
<?php $x = array_merge ("a", "b"); ?>
Ca provoque l'affichage d'une page "Le site Web ne peut pas afficher la page Erreur 500" avec IE. Et encore pire avec Firefox, il ne se passe absolument rien et c'est la page précédemment affichée (qui n'a rien à voir) qui reste affichée.

Par contre si mon code est
<?php echo "a";
$x = array_merge ("a", "b"); ?>
j'ai bien le message d'erreur : "PHP Warning: array_merge() [function.array-merge]: Argument #1 is not an array in ..."

D'où ma question : comment faire pour que les messages d'erreurs apparaissent même si rien n'est encore affiché à l'écran ? Probablement une question d'entête envoyé par je ne sais pas trop qui, ou un paramétrage de php.ini.

Merci

Posté : 29 juil. 2008, 20:59
par Sékiltoyai
Essaye de t'y connecter par telnet pour détecter la différence entre les deux résultats au niveau en-têtes. Si c'est cela le problème, je pense que tu auras peut être une différence…

Posté : 29 juil. 2008, 21:30
par caroube
Merci de ta réponse.

Dans le premier cas, j'ai

Code : Tout sélectionner

PHP Warning: array_merge() [<a href='function.array-merge'>function.array-merge </a>]: Argument #1 is not an array in D:\xxx\test.php on line 3 PHP Warning: array_merge() [<a href='function.array-merge'>function.array-merge </a>]: Argument #2 is not an array in D:\xxx\test.php on line 3 Status: 200 OK X-Powered-By: PHP/5.2.6 Content-type: text/html <br /> <b>Warning</b>: array_merge() [<a href='function.array-merge'>function.array-me rge</a>]: Argument #1 is not an array in <b>D:\xxx\test.php</b> on line <b>3</b><br /> <br /> <b>Warning</b>: array_merge() [<a href='function.array-merge'>function.array-me rge</a>]: Argument #2 is not an array in <b>D:\xxx\test.php</b> on line <b>3</b><br />
Dans le second

Code : Tout sélectionner

PHP Warning: array_merge() [<a href='function.array-merge'>function.array-merge </a>]: Argument #1 is not an array in D:\xxx\test.php on line 3 PHP Warning: array_merge() [<a href='function.array-merge'>function.array-merge </a>]: Argument #2 is not an array in D:\xxx\test.php on line 3 Status: 200 OK X-Powered-By: PHP/5.2.6 Content-type: text/html a<br /> <b>Warning</b>: array_merge() [<a href='function.array-merge'>function.array-me rge</a>]: Argument #1 is not an array in <b>D:\xxx\test.php</b> on line <b>3</b><br /> <br /> <b>Warning</b>: array_merge() [<a href='function.array-merge'>function.array-me rge</a>]: Argument #2 is not an array in <b>D:\xxx\test.php</b> on line <b>3</b><br />
1) Je n'avais d'ailleurs pas remarqué que le message d'erreur s'affiche deux fois, y compris en mode web.
2) en mode telnet, la différence entre le 1er et le second, c'est le "a" de l'echo juste après le "content-type".
3) c'est ce qu'il y a avant le status qui s'affiche dans le browser car le warning n'est pas affiché en gras et il n'y a pas de retour chariot entre les deux messages d'erreur.

Edit 1 : il y a deux erreurs car les deux arguments de la fonction sont faux. On laisse tomber le point 1

Edit 2 : c'est encore pire que ce je croyais. En fait, le mode opératoire est le suivant, en modifiant la page test.php et en rechargeant :
<? array_merge ("a", "b"); ?>
---> Le site Web ne peut pas afficher la page; Erreur 500
<? 
echo "a";
array_merge ("a", "b"); 
?>
---> Le site Web ne peut pas afficher la page; Erreur 500
<? 
echo "a";
//array_merge ("a", "b"); 
?>
---> a
<? 
array_merge ("a", "b"); 
?>
---> PHP Warning: array_merge() [function.array-merge]: Argument #1 ...

En fait, il a fallu qu'il y ait un affichage correct de la page test pour qu'ensuite le message d'erreur s'affiche. Par contre, si j'ouvre une page test2.php avec une erreur, je repars avec l'erreur 500. Jusqu'à ce qu'il y ait un affichage correct de test2.php. Et là, ensuite, à l'affichage suivant, j'ai bien le message d'erreur.

Sinon, tout le reste reste vrai

Edit 3 : Encore un nouvel essai ce matin. En lançant le script en mode telnet avec redirection

Code : Tout sélectionner

c:\>php-cgi.exe test.php > test.txt PHP Warning: array_merge() [<a href='function.array-merge'>function.array-merge </a>]: Argument #1 is not an array in D:\xxx\test.php on line 3 PHP Warning: array_merge() [<a href='function.array-merge'>function.array-merge </a>]: Argument #2 is not an array in D:\xxx\test.php on line 3
et on récupère dans test.txt

Code : Tout sélectionner

Status: 200 OK X-Powered-By: PHP/5.2.6 Content-type: text/html <br /> <b>Warning</b>: array_merge() [<a href='function.array-merge'>function.array-me rge</a>]: Argument #1 is not an array in <b>D:\xxx\test.php</b> on line <b>3</b><br /> <br /> <b>Warning</b>: array_merge() [<a href='function.array-merge'>function.array-me rge</a>]: Argument #2 is not an array in <b>D:\xxx\test.php</b> on line <b>3</b><br />
Ce qui veut dire que la sortie standard et la sortie erreur ne sont pas identiques.

Donc maintenant, la question est : comment faire en sorte que la sortie erreur ne soit pas envoyée au browser, mais uniquement la sortie standard.

Posté : 03 août 2008, 11:13
par Alf
Deja la fonction array_merge() Fusionne un ou plusieurs tableaux
Description
array array_merge ( array $array1 [, array $array2 [, array $... ]] )
en lui passant des chaines, c'est probablement la cause du plantage de ton script CGI et par conséquent de l'erreur 500 renvoyée par le serveur.

Un tableau ne s'affiche pas avec echo mais avec vardump ou print_r.


S'il te plait, peux tu mettre des vrais tag PHP à tes scripts ? ça pique les yeux.
<?php  echo("a"); ?>
et non
<?  echo("a"); ?>
cette petite modif s'accompagnera du tag short_open_tag à off dans ton php.ini
short_open_tag = Off
Voilou

Posté : 03 août 2008, 15:23
par Patriboom
J'ai eu le même problème quand - par erreur - j'avais changé les permissions sur mon répertoire.
Toutes les pages PHP cnservées dans un répertoire à permission 777 bloquaient. Il faut que ce soit 755.

Posté : 03 août 2008, 20:24
par caroube
Merci,

Finalement, j'ai résolu le problème.
J'ai mis le flag display_error de php.ini à off.
Comme ça, l'erreur avant l'entête n'est plus envoyée et seule l'erreur après l'entête l'est. Ce qui ne provoque plus l'erreur 500.

Mettre un display_erreur à off pour pouvoir afficher les erreurs, il y a une logique qui m'échappe un peu :roll:

@alf
en lui passant des chaines, c'est probablement la cause du plantage de ton script CGI
C'est plus que probable, c'est même certain. Bien sûr qu'il y a un problème avec array_merge. Je le sais, c'est fait exprès. C'est un exemple d'erreur. Le problème n'est là-dessus, mais sur le fait que j'ai erreur 500 au lieu de l'affichage du warning qui me permettrait de localiser l'erreur. Là, c'est un exemple avec 2 lignes. Mes scripts en font quelques centaines à quelques milliers, avec des appels de bibliothèques, de templates, ...
S'il te plait, peux tu mettre des vrais tag PHP à tes scripts ? ça pique les yeux.
Effectivement, je les ai rajouté à la main ici. Mais dans le vrai code (qui est un peu plus compliqué que cet exemple), il y a les "vrais" tags.
cette petite modif s'accompagnera du tag short_open_tag à off dans ton php.ini
Ca c'est surtout accompagné de la mise à short_open_tag à on parce qu'il y a encore beaucoup de bibliothèques de fonctions, récupérées à droite et à gauche qui sont encore avec des <?
Et que j'ai autre chose à faire que de changer ces tags dans des bibliothèques qui, au demeurant fonctionnent très bien. Surtout quand en plus, tu as juste une erreur 500 qui ne te permet pas de savoir dans quel script se trouve l'erreur.
Un tableau ne s'affiche pas avec echo mais avec vardump ou print_r.
Tu dois encore avoir les yeux qui piquent car nulle part j'ai fait un echo de l'array_merge.

Posté : 03 août 2008, 20:28
par Patriboom
De faire disparaìtre les messages d'erreur ne corrige pas les erreurs. Ça ne fait que ne pas les afficher. Il vaut mieux corriger les erreurs que les ignorer. Si tu préfères les ignorer, c'est ton choix, mais il ne faudrait pas te surprendre de voir certains éléments de ton site cesser de fonctionner apparamment sans raison.

Bref, il vaudrait mieux trouver la source de l'erreur que de gommer les avertissements.

Posté : 03 août 2008, 20:36
par caroube
Bref, il vaudrait mieux trouver la source de l'erreur que de gommer les avertissements.
Il y a un truc que vous n'avez pas compris. Ou alors je n'ai pas été très clair.
Ce que je voulais (et que j'ai finalement obtenu), c'est qu'au lieu d'avoir une page qui affiche erreur 500 et basta, j'ai une page qui me dit "Warning PHP : erreur machin à la ligne truc". Il ne s'agit pas de masquer les erreurs, mais au contraire de les faire apparaître.

Après je corrige bien sûr.

J'ai dit : Mettre un display_erreur à off pour pouvoir afficher les erreurs

Posté : 03 août 2008, 20:56
par Sékiltoyai
On dirait qu'ils te prennent pour un débutant :mrgreen:

Posté : 03 août 2008, 21:11
par Patriboom
À ces conditions, c'est dans ton .htaccess qu'il agir.

Ceci peut t'aider:

http://aspirine.org/htaccess.html

Posté : 03 août 2008, 21:50
par Sékiltoyai
Sur IIS ? Bizarrement j'ai un gros doute…

Posté : 04 août 2008, 04:37
par Patriboom
oups, excusez. Je n'étais pas orienté de la bonne façon dans ma lecture.

Posté : 04 août 2008, 08:34
par caroube
@Patriboom
Même si j'avais été sous Apache, je ne vois pas trop le rapport entre une erreur 500 et les code et mot de passe définis dans .htaccess.
D'autre part, c'est louable de vouloir aider, mais il faut également lire ce qu'écrit la personne qui fait une demande (en l'occurrence moi).

@Sékiltoyai
Il y a la possibilité d'avoir un .htaccess dans IIS, sans toute la richesse d'Apache puisqu'uniquement limité à la définition des droits d'accès. C'est un produit qui s'appelle IISPassword, initialement développé par Troxo : sa version 1 était gratuite. Visiblement la politique commerciale a changé et la V2 est maintenant payante sauf une version limitée à 3 utilisateurs.