Solution à l'erreur php 500 : 1. Vérifiez le script PHP et modifiez-le ; 2. Capturez l'exception et enregistrez l'exception dans le journal ; 3. Analysez le journal et traitez-le.
L'environnement d'exploitation de cet article : système Windows 7, PHP version 7.1, ordinateur Dell G3.
Comment résoudre le problème d'erreur php 500 ?
Erreur PHP et 500
Pendant le processus de développement PHP, 500 erreurs sont souvent renvoyées et il n'y a aucun contenu de débogage (disponible) dans le corps. À ce stade, vous devez déboguer lentement (points d'arrêt, activer le mode de débogage, etc.), mais s'il s'agit d'un réseau actif, cette erreur est plus frustrante. Il n'est pas facile de casser les points ni d'activer le mode de débogage. Mais comme c’est une erreur, il y a toujours une solution. Analysons les causes et les solutions de 500 étape par étape.
0x01, 500 error
L'erreur 500, également appelée Internal Server Error (erreur de service interne), signifie que le service ne peut pas traiter la demande en raison d'une erreur inconnue. Dans les sites PHP, il est généralement renvoyé par PHP, c'est-à-dire que 500 erreurs sont généralement des erreurs dans les scripts PHP.
php-fpm capture packet 500
Comme vous pouvez le voir sur l'image ci-dessus (architecture Nginx + PHP-FPM), lorsque PHP appelle une classe inexistante, le script génère une erreur et renvoie 500 à Nginx (et Le message d'erreur est également renvoyé, mais il est déchargé dans STDERR).
0x02, quelles exceptions d'erreur provoqueront 500
Alors, quel type d'erreurs provoquera 500 erreurs ? Tous les niveaux d'erreur de PHP peuvent être trouvés dans la documentation officielle de PHP (http://php.net/manual/zh/errorrfunc) .constants.php), et les niveaux d'erreur de E_ERROR, E_PARSE, E_RECOVERABLE_ERROR, E_USER_ERROR et les exceptions non interceptées provoqueront tous 500 erreurs.
Erreur de niveau E_ERROR causée par 500
0x03, dans quelles circonstances l'erreur ne retournera pas 500
Comme mentionné ci-dessus, cela est dû à une erreur dans le script PHP, mais s'il y a une erreur ou exception dans le script PHP, cela provoquera certainement 500 ? Évidemment non, même si le script comporte une erreur fatale, il peut toujours en renvoyer 200.
Option de configuration display_errors
Dans les applications Web basées sur python, nodejs, etc., par défaut, si un message d'exception se produit, il sera imprimé sur la console (STDERR/STDOUT). En PHP basé sur l'architecture PHP-FPM, il n'y a pas de console à imprimer, et ses stderr et stdout sont définis sur les STRDERR et STDOUT correspondants dans FastCGI. Si l'erreur est redirigée vers STDOUT, l'erreur sera générée directement dans la réponse et le code d'état sera défini sur 200. C'est également la capacité obtenue par l'option display_errors.
La configuration de l'option display_errors doit être implémentée via ini_set. La configuration de display_errors dans le document PHP indique que la valeur est un type chaîne. En utilisation réelle, les nombres et les types booléens peuvent également activer ou désactiver cette configuration.
error_reporting configuration
display_errors contrôle si les détails de l'erreur sont affichés et si les codes d'état d'erreur sont renvoyés lorsqu'une erreur se produit dans le script PHP, tandis que l'élément error_reporting est utilisé pour contrôler quel niveau d'erreurs peut être imprimé directement.
Les éléments de configuration de error_reporting peuvent être configurés via error_reporting(E_ALL) ou ini_set('error_reporting', E_ALL). Pour plus de détails sur les paramètres de fonction, veuillez vous référer à la documentation PHP.
Il convient de noter que PHP lui-même a des journaux d'erreurs (deux éléments de configuration, error_log et log_errors). Si une erreur se produit, PHP écrira l'erreur dans le journal des erreurs. Les erreurs à écrire sont affectées par l'élément error_reporting. de contrôle.
Ne pas afficher les détails de l'erreur lorsque le niveau d'erreur ne correspond pas
0x04, comment gérer raisonnablement 500 sur le réseau existant
L'apparition de l'erreur 500 a montré que le script PHP ne peut pas s'exécuter normalement, et tout ce qui peut être fait pour le moment est de capturer les exceptions détectées et enregistrées dans le journal pour faciliter le débogage futur et la gestion des bogues réseau en direct.
PHP est livré avec un journal d'erreurs
PHP lui-même a déjà des enregistrements de journal d'erreurs. Vous pouvez définir l'élément log_errors sur On dans php.ini et coopérer avec l'élément de configuration error_log pour spécifier le chemin de stockage du journal d'erreurs. .
Commutateur de journalisation des erreurs
Paramètre du chemin du journal
L'écriture de ce journal d'erreurs n'est pas contrôlée par la configuration de display_errors. Autrement dit, que display_errors soit activé ou non, les erreurs seront enregistrées dans le journal. Cependant, il est contrôlé par la configuration error_reporting. Si le niveau d'erreur actuel ne correspond pas au niveau d'erreur dans error_reporting, l'erreur ne sera pas écrite dans le journal. Autrement dit, si le niveau d'erreur est E_ERROR, mais que le paramètre est error_reporting(E_NOTICE), le message d'erreur E_ERROR n'apparaîtra pas dans le journal. Le journal des erreurs PHP enregistre différents types d'erreurs. fonction de manipulation. L'enregistrement des erreurs peut être réalisé en écrivant les informations d'erreur capturées dans le journal spécifié via une fonction. Pour plus de détails sur l'utilisation de la fonction
, veuillez vous référer à http://km.oa.com/group/19368/articles/show/302491 Voici un modèle :
$previousHandler = set_exception_handler(function(Exception $ex) use (&$previousHandler) { call_user_func('exceptionHandler', $ex, $previousHandler); }); set_error_handler('errorHandler'); register_shutdown_function('fatalErrorHandler'); function exceptionHandler(Exception $ex, $previousHandler) { $info = array( $ex->getFile(), $ex->getLine(), $ex->getCode(), $ex->getMessage() ); // 记录日志 logPHPError($info); if (isset($previousHandler) && is_callable($previousHandler)) { call_user_func($previousHandler, $ex); } } /** * 框架错误处理函数 * @param $errno * @param $errstr * @param $errfile * @param $errline * @return bool */ function errorHandler($errno = 0, $errstr = '', $errfile = '', $errline = 0) { switch ($errno) { case E_WARNING: $errname = 'E_WARNING'; break; case E_NOTICE: $errname = 'E_NOTICE'; break; case E_STRICT: $errname = 'E_STRICT'; break; case E_RECOVERABLE_ERROR: $errname = 'E_RECOVERABLE_ERROR'; break; case E_DEPRECATED: $errname = 'E_DEPRECATED'; break; case E_USER_ERROR: $errname = 'E_USER_ERROR'; break; case E_USER_WARNING: $errname = 'E_USER_WARNING'; break; case E_USER_NOTICE: $errname = 'E_USER_NOTICE'; break; case E_USER_DEPRECATED: $errname = 'E_USER_DEPRECATED'; break; default: restore_error_handler(); return false; } // 记录日志 $info = array( $errfile, $errline, $errname, $errstr ); logPHPError($info); restore_error_handler(); return false; } /** * Fatal error错误处理 */ function fatalErrorHandler() { if (($e = error_get_last()) && $e['type'] === E_ERROR) { $info = array( $e['file'], $e['line'], 'E_ERROR', $e['message'] ); // 记录日志 logPHPError($info); } }
0x05 Summary
Pour résumer. up, error_reporting est utilisé pour contrôler les fonctions ou les configurations qui génèrent des niveaux d'informations sur les erreurs dans le navigateur ou dans le journal des erreurs PHP, et display_errors contrôle s'il faut afficher des informations sur les erreurs et les avertissements dans le navigateur.
Étant donné que le journal des erreurs de PHP est global et contrôlé par error_reporting, il est recommandé d'implémenter votre propre logique de capture et d'enregistrement des erreurs (exceptions) dans votre entreprise.
Apprentissage recommandé : "
Tutoriel vidéo PHP"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!