Pourquoi debug_backtrace() renvoie-t-il vide ?
P粉204136428
2023-07-31 11:21:13
<p>J'ai un morceau de code PHP exécuté sur PHP 7.4. <br /><br />Une partie de celui-ci est un script PHP de niveau supérieur (/home/path/a.php), qui contient une série de blocs try-catch et inclut des objets et divers fichiers inclus. appels. <br /><br />Ces blocs try-catch lèveront des exceptions en cas d'erreurs client et d'exécution. <br /><br />Dans l'instruction throw, un journal des erreurs est inclus, y compris un debug_backtrace() imprimé dans le journal des erreurs. </p><p><code></code></p>
<pre class="brush:php;toolbar:false;">// du code
utilisez some/path/to/objects ;
$base de données = nouvelle base de données();
inclure "some/file/reference.php" ;
essayer {
// diverses choses, y compris les données $_SESSION
if (vide($_SESSION['b']) || vide($_POST['d'])) {
si(vide($_SESSION['b'])) {
error_log("la session apparaît vide. Non b");
}
si(vide($_POST['d'])) {
error_log("POST apparaît vide. Non d");
}
throw new RuntimeException('Détails de validation/formulaire incorrects donnés.');
}
}
catch (RuntimeException | Exception $ex) {
error_log("Page de connexion : ".$_SESSION['message']);
error_log("debug: ".print_r(debug_backtrace(),true));
}</pré>
<p>Cependant, ce code s'exécute et collecte les erreurs correctement, mais le journal des erreurs affiche uniquement ceci : </p>
<blockquote>
<p>[31-Jul-2023 18:42:17 Europe/Londres] Un message de retour personnalisé de $_SESSION['message']</p><p>
[31 juillet 2023 18:42:17 Europe/Londres] Array</p><p>
(<br /> )</p>
</blockquote>
<p>Pourquoi debug_backtrace() est-il vide ici ? Je m'attendais à ce qu'il affiche au moins les paramètres et variables fournis par la page, ou les données de SESSION ou les données d'environnement. <br /><br />J'ai utilisé cette méthode ailleurs et (pour autant que je me souvienne), elle a bien fonctionné. Ai-je manqué quelque chose? </p><p><br /></p>
debug_backtrace()
Une pile d'appels est fournie pour savoir où vous vous trouvez, mais vous êtes déjà dans la portée la plus externe (c'est-à-dire globale) et n'avez effectué aucun appel, donc aucune pile d'appels n'est disponible.Le résultat produit est :
Si vous mettez le code dans une fonction, vous obtiendrez une pile d'appels contenant un élément :
Le résultat produit est :
Si vous souhaitez obtenir des informations (minimales) de débogage dans la portée globale, vous pouvez envelopper tout le code dans une fermeture et l'appeler immédiatement en ligne :
Résultats
Concernant les données de session/environnement, elles ne seront affichées que si vous les passez en paramètres :
Résultat :
Si vous souhaitez enregistrer des variables de session/environnement comme celle-ci, le meilleur moyen est probablement de les afficher explicitement :
error_log(print_r($_ENV, true)); error_log(print_r($_SESSION, true));