Dans le développement Web, en particulier dans les projets utilisant PHP + MySQL, les différences de comportement de la base de données entre l'environnement de développement et l'environnement en ligne provoquent souvent une série de problèmes étranges. Par exemple, certaines requêtes sont rapides localement, mais la ligne est aussi lente qu'un escargot; Ou aucune erreur n'est signalée localement, mais l'exécution en ligne échoue. Dans ce cas, s'il n'y a pas d'indices clairs pour le suivre, beaucoup de temps peut être perdu.
Heureusement, l'extension MySQLI de PHP fournit un outil de débogage très pratique - la méthode mysqli :: debug () . Bien que cette approche ne soit pas bien connue, elle peut fournir une aide critique dans certains scénarios, en particulier dans le positionnement des problèmes et l'optimisation des performances .
MySQLI :: Debug () est une méthode statique de la classe MySQLI qui permet la sortie de débogage. Il vous permet d'enregistrer les informations de débogage de libmysqlclient . Le format est le suivant:
mysqli::debug("d:t:o,/tmp/client.trace");
Description du paramètre:
D : activer le débogage
T : créer un fichier de débogage pour chaque thread
o, / tmp / client.trace : spécifiez le chemin du fichier de sortie
?? Remarque: Cette méthode n'est valide que lors de l'utilisation de libmysqlclient et n'est généralement activée que pendant la phase de débogage. L'environnement de production doit éviter d'être activé par défaut.
Ce qui suit est un scénario d'utilisation typique:
<?php
mysqli::debug("d:t:o,/tmp/dev_trace.log");
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_error) {
die("Échec de la connexion: " . $mysqli->connect_error);
}
$result = $mysqli->query("SELECT * FROM users WHERE status = 'active'");
while ($row = $result->fetch_assoc()) {
echo $row['name'] . "<br>";
}
$mysqli->close();
?>
Vous pouvez en savoir plus sur le processus d'exécution SQL, le processus de connexion et d'autres détails en affichant le fichier /tmp/dev_trace.log .
<?php
mysqli::debug("d:t:o,/tmp/prod_trace.log");
$mysqli = new mysqli("127.0.0.1", "user", "password", "database");
// Généralement, nous recommandons les interfaces d'accès à la journalisation,Par exemple:
$url = "https://m66.net/api/user/status"; // Exemple URL
file_put_contents("/tmp/trace_log_access.log", "Visité: $url\n", FILE_APPEND);
$result = $mysqli->query("SELECT * FROM users WHERE status = 'active'");
while ($row = $result->fetch_assoc()) {
// Simplifier le traitement
}
$mysqli->close();
?>
Vous pouvez comparer des fichiers de trace dans les environnements de développement et de production, tels que l'utilisation de l'outil DIFF ou de la fonction de comparaison IDE pour voir quels comportements sont incohérents:
Coutration horaire d'exécution de la requête
Existe-t-il une conversion implicite (comme la chaîne en numéro)
Y a-t-il une connexion pour réessayer
L'optimiseur SQL sélectionne-t-il un index différent
En comparant les fichiers de trace des deux environnements, vous pouvez:
Identifiez les raisons de la requête lente :
La logique de requête n'a pas changé, mais la ligne est lente? Il se peut que l'index ne soit pas synchronisé.
Confirmez la différence de configuration de la connexion :
Différents paramètres de max_allowed_packet et de délai d'expiration peuvent affecter le comportement.
Identifiez l'impact des différences de version de la base de données :
Certains écrits SQL peuvent être très différents dans les plans d'exécution en 5.7 et 8.0.
Le problème du positionnement auxiliaire "en ligne ne peut pas être reproduit" :
Le journal de trace peut clairement afficher l'intégralité du processus d'exécution, en évitant le angle mort de "le code est correct mais l'erreur se produit".
Bien que MySqli :: Debug () ne soit pas un outil incontournable pour les développeurs dans la vie quotidienne, il peut fournir des indices clés lors du dépannage des problèmes de base de données complexes. L'utiliser pour comparer le comportement de l'environnement de développement avec l'environnement en ligne est une stratégie de débogage à très faible coût et à récompense élevé .
Tant que vous maîtrisez le calendrier d'utilisation et le contrôle des autorisations et des emplacements de fichiers, MySqli :: Debug () peut devenir votre arme secrète pour optimiser les performances et dépanner les différences.