2017-10-10 1 views
0

J'ai un problème étrange avec la sortie d'erreur sur le serveur intégré de PHP, et cela ressemble vraiment à un bug, mais je ne suis pas sûr à 100%.Serveur local PHP - double erreurs - bug ou non?

script Exemple:

<?php 
error_reporting(-1); 
ini_set('display_errors', '0'); 
ini_set('log_errors', '1'); 
ini_set('ignore_repeated_errors', true); 

trigger_error('my notice', E_USER_NOTICE); 
trigger_error('my warning', E_USER_WARNING); 

Si vous exécutez ce code dans la console (php example.php), vous obtenez ce qui suit, prévu, sortie:

PHP Notice: my notice in C:\php\example.php on line 7 
PHP Stack trace: 
PHP 1. {main}() C:\php\example.php:0 
PHP 2. trigger_error('my notice', 1024) C:\php\example.php:7 
PHP Warning: my warning in C:\php\example.php on line 8 
PHP Stack trace: 
PHP 1. {main}() C:\php\example.php:0 
PHP 2. trigger_error('my warning', 512) C:\php\example.php:8 

Cependant, si vous exécutez ce script une page Web (php -S localhost:9000 example.php), et ouvrez l'URL, vous obtenez la sortie suivante dans la console:

PHP 7.1.10 Development Server started at Tue Oct 10 19:46:05 2017 
Listening on http://localhost:9000 
Document root is C:\php 
Press Ctrl-C to quit. 
[Tue Oct 10 19:46:06 2017] PHP Notice: my notice in C:\php\example.php on line 7 
[Tue Oct 10 19:46:06 2017] PHP Stack trace: 
[Tue Oct 10 19:46:06 2017] PHP 1. {main}() C:\php\example.php:0 
[Tue Oct 10 19:46:06 2017] PHP 2. trigger_error('my notice', 1024) C:\php\example.php:7 
[Tue Oct 10 19:46:06 2017] PHP Warning: my warning in C:\php\example.php on line 8 
[Tue Oct 10 19:46:06 2017] PHP Stack trace: 
[Tue Oct 10 19:46:06 2017] PHP 1. {main}() C:\php\example.php:0 
[Tue Oct 10 19:46:06 2017] PHP 2. trigger_error('my warning', 512) C:\php\example.php:8 
[Tue Oct 10 19:46:07 2017] PHP Notice: my notice in C:\php\example.php on line 7 
[Tue Oct 10 19:46:07 2017] PHP Stack trace: 
[Tue Oct 10 19:46:07 2017] PHP 1. {main}() C:\php\example.php:0 
[Tue Oct 10 19:46:07 2017] PHP 2. trigger_error('my notice', 1024) C:\php\example.php:7 
[Tue Oct 10 19:46:07 2017] PHP Warning: my warning in C:\php\example.php on line 8 
[Tue Oct 10 19:46:07 2017] PHP Stack trace: 
[Tue Oct 10 19:46:07 2017] PHP 1. {main}() C:\php\example.php:0 
[Tue Oct 10 19:46:07 2017] PHP 2. trigger_error('my warning', 512) C:\php\example.php:8 

La chose la plus étrange est que si vous ajoutez trigger_error('my error', E_USER_ERROR); au bas de l'exemple de script, la sortie double est fixe.

Qu'est-ce qui cause cela? Est-ce un bug ou un peu bizarre avec les configs INI?

+2

Avant tout, assurez-vous qu'il n'y a qu'une seule requête HTTP. La sortie que vous avez publiée est normale pour deux demandes. – axiac

+0

L'avez vous essayé vous-même? – jurchiks

+0

Dunno si cela rétrécit, mais je ne pouvais pas répliquer cela sur ma machine Linux. –

Répondre

1

En fait, la réponse est dans la question. Vous avez lancé le serveur Web interne avec un script et il utilise le script en tant que routeur. Cela signifie qu'il appelle ce script pour chaque requête qu'il reçoit. Le navigateur, bien sûr, nécessite favicon.ico et le reste vous avez déjà compris.

Lancer le serveur web interne du PHP sans routeur, utilisez l'option de ligne de commande -t pour lui dire où trouver les fichiers vers le serveur (le répertoire racine du site):

php -S localhost:9000 C:\php 
+0

Qui écrit même du code PHP sans un routeur ces jours-ci, cmon man. Ce style est si vieux, obsolète et cause des problèmes inutiles. Je vais voter uniquement parce que cela fonctionnerait SI j'ai écrit du code comme ça, mais je ne le fais pas, donc je ne peux pas l'accepter. – jurchiks

+0

Qui écrit un site sans 'favicon.ico' ces jours-ci, cmon man ;-) – axiac

+0

Qu'en est-il des API? – jurchiks

0

TL; DR - pas de vraie solution disponible, seulement des solutions de contournement.

Version longue:

Apparemment, cela est causé par le navigateur toujours demandant un favicon, et il n'y a littéralement aucun moyen de lui dire d'arrêter, sans en-tête ou quoi que ce soit.

La seule chose que vous pouvez faire est soit 1) mettre en œuvre effectivement un favicon.ico pour votre API ou 2) mettre un lien dans votre bloc de la page <head>, comme ceci:

<head> 
    <link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgo="> 
</head> 

La deuxième option évidemment ne fonctionnera pas pour les API JSON et autres, donc si vous ouvrez un itinéraire qui répond avec autre chose que du HTML dans votre navigateur (par exemple une demande API de votre application d'une page vers le backend), ou même accéder directement à un contenu statique par exemple http://localhost:9000/css/reset.css, qui apparemment demande également un favicon si l'un n'a pas encore été mis en cache) - seule l'option 1 est "bonne" pour cela.