Aktueller Standort: Startseite> Neueste Artikel> Warum werden die Protokollinformationen von MySQLI :: Debugg leer angezeigt?

Warum werden die Protokollinformationen von MySQLI :: Debugg leer angezeigt?

M66 2025-05-17

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?

1. Verwenden Sie MySQLI :: Debuggen richtig debuggen

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.

2. Analyse gemeinsamer Gründe, warum Protokolle leer sind

Hier sind einige häufige Gründe, die dazu führen können, dass die Protokollinformationen, die Sie sehen, leer sind:

1. MySQLI -Debugging -Unterstützung ist nicht aktiviert

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.

2. Keine Schreibberechtigung

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

3. Der Debug -Anruf ist falsch

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");

4.. Persistente Verbindung wird verwendet

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.

5. Keine tatsächliche SQL -Ausführung

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");

3.. Debugging Fähigkeiten und Vorschläge

  • 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.

4. Beispielcode

 <?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!

V. Andere Ressourcen