Die Verwendung von MySQLI :: Debug () ist eine sehr praktische Methode beim Debuggen von MySQLI -Verbindungen und -ausführung. Es können zugrunde liegende Anrufe, Verbindungsdetails, Ausführungsanweisungen und andere Informationen in Protokolldateien aufgezeichnet werden und die Probleme analysieren. Aber manchmal können Entwickler auf ein verwirrendes Phänomen stoßen: Nach dem Aufrufen von MySQLI :: Debug () sehen sie keine Ausgabe in der erwarteten Protokolldatei und das Protokoll ist leer. Was kann also die Ursache dafür sein?
Bevor wir das Problem analysieren, bestätigen wir zunächst, ob MySQLI :: debug () richtig aufgerufen wird. Die grundlegende Verwendung ist wie folgt:
mysqli::debug("d:t:o,/tmp/client.trace");
$mysqli = new mysqli("localhost", "username", "password", "database");
Erläutern Sie die Debugging -Optionen:
D : Debugg Dispatcher (allgemeine Debug -Verfolgung)
T : Aufzeichnungsverfolgungsinformationen (Verfolgung)
o,/tmp/client.trace : Ausgabe des Protokolls in die Datei /tmp/client.trace ausgeben
??Vorsichtsmaßnahmen:
MySQLI :: Debug () muss aufgerufen werden, bevor die Verbindung wirksam erstellt .
Mysqli :: debug () ist eine statische Methode , die nichts mit der spezifischen Verbindungsinstanz zu tun hat.
Hier sind einige häufige Gründe, die dazu führen können, dass die Protokollinformationen, die Sie sehen, leer sind:
Die MySQLi :: Debug () -Funktion basiert auf der MySQL -Client -Bibliothek (libmysqlient oder MySQLnd). Mysqli :: debug () wird nur bei der Verwendung von MySQLND (MySQL Native Treiber) unterstützt. Wenn Ihr PHP libmysqlclient verwendet, wird die Debugging -Funktion möglicherweise nicht wirksam.
Sie können bestätigen von:
echo mysqli_get_client_stats() ? 'mysqlnd' : 'libmysqlclient';
oder:
phpinfo(); // Finden mysqlnd Ob zu aktivieren
Wenn Sie libmysqlclient verwenden, wird empfohlen, auf MySQLND umzusteigen.
Wenn der angegebene Protokollpfad ( z . Stellen Sie sicher, dass in diesem Pfad Benutzer Berechtigungen an Benutzer schreiben, die PHP ausführen (z. B. www-data, apache, nginx).
Sie können die Berechtigungen testen:
sudo touch /tmp/client.trace
sudo chown www-data:www-data /tmp/client.trace
sudo chmod 664 /tmp/client.trace
Wenn MySQLI :: debug () nach dem Erstellen der Verbindung aufgerufen wird, wird dies nicht wirksam. Stellen Sie sicher, dass Sie sicherstellen, dass es vor New MySQLI () aufgerufen wird!
Fehlerdemonstration:
$mysqli = new mysqli("localhost", "username", "password", "database");
mysqli::debug("d:t:o,/tmp/client.trace"); // ungültig!
Richtiges Schreiben:
mysqli::debug("d:t:o,/tmp/client.trace");
$mysqli = new mysqli("localhost", "username", "password", "database");
In einigen Fällen, wenn Sie eine anhaltende Verbindung in Form von P: Host verwenden, kann das Debuggen möglicherweise keine Informationen wie erwartet protokollieren. Sie können die Fehlerbehebung mit nicht-persistenten Verbindungen versuchen.
Wenn nach der Erstellung der Verbindung keine Abfrage durchgeführt wird, gibt es möglicherweise keine Informationen im Protokoll. Sie können versuchen, einen einfachen Abfragetest hinzuzufügen:
mysqli::debug("d:t:o,/tmp/client.trace");
$mysqli = new mysqli("localhost", "username", "password", "database");
$mysqli->query("SELECT * FROM users");
Verwenden Sie einen absoluten Pfad, um das Protokoll wie /var/log/mysqli.trace auszugeben, und setzen Sie die entsprechenden Berechtigungen.
Verwenden Sie unabhängige Skripte, um Debugging -Funktionen nach Möglichkeit zu testen, um zu vermeiden, dass sie durch komplexe Geschäftslogik gestört werden.
Es wird empfohlen, den Protokollweg nicht im öffentlichen Netzwerk zu platzieren, um auf das Verzeichnis zuzugreifen, um Informationen zu vermeiden.
<?php
// Legen Sie den Debug -Protokollweg fest
mysqli::debug("d:t:o,/tmp/mysqli_debug.log");
// Stellen Sie eine Datenbankverbindung her
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_database");
// Eine Frage ausführen
$result = $mysqli->query("SELECT * FROM users");
// Ergebnisse zeigen
while ($row = $result->fetch_assoc()) {
echo $row['username'] . "\n";
}
?>
Sie können die Protokollausgabe in /tmp/mysqli_debug.log anzeigen. Denken Sie daran, Schreibberechtigungen festzulegen!
Offizielles Dokument (ersetzt durch M66.NET -Domänenname)