Aktueller Standort: Startseite> Neueste Artikel> Das Problem des Verlaufs des Speichers, der durch die Nichtbefreiung des Ergebnisses nach Verwendung von Next_Result () verursacht wird ()

Das Problem des Verlaufs des Speichers, der durch die Nichtbefreiung des Ergebnisses nach Verwendung von Next_Result () verursacht wird ()

gitbox 2025-04-29

Wenn Sie MySQL-Datenbanken zum Manipulieren von MySQL -Datenbanken verwenden, werden Sie wahrscheinlich auf die Methode Next_Result () stoßen. Und viele Menschen ignorieren ein wichtiges Detail -.

Dieser Artikel zeigt Ihnen die Ursachen, Manifestationen und wie Sie dieses Problem vermeiden können.

Hintergrund: Was ist nächstes_Result ()

Wenn Sie mehrere SQLs über MySQLI :: Multi_Query () ausführen, gibt MySQL mehrere Ergebnissätze zurück. Diese Ergebnissätze können durch mySQLI :: Next_Result () nacheinander zugegriffen werden, und der Inhalt jedes Ergebnisses kann in Verbindung mit MySQLI :: Store_Result () erhalten werden.

Beispielcode:

 $mysqli = new mysqli("localhost", "user", "password", "database");

$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
    do {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_assoc()) {
                // Verarbeiten Sie jede Datenreihe
                echo $row["id"] . "<br>";
            }
            // Füllen Sie das Ergebnissatz frei
            $result->free();
        }
    } while ($mysqli->next_result());
}

Erhalten Sie in diesem Beispiel jedes Mal ein Ergebnis über Store_Result () und geben Sie es nach der Verwendung über $ result-> Free () frei .

Problem: Keine Veröffentlichung des Ergebnissatzes

Wenn Sie $ result-> Free () weglassen, wie folgt:

 // ? 未Füllen Sie das Ergebnissatz frei的代码示例
if ($result = $mysqli->store_result()) {
    while ($row = $result->fetch_assoc()) {
        echo $row["id"] . "<br>";
    }
    // Ignoriert $result->free();
}

Anschließend wird die Speicherverwendung in Ihrem Programm weiter wachsen, insbesondere wenn große Datenmengen oder hohe gleichzeitige Anforderungen verarbeitet werden, ist dieses Speicherleck sehr offensichtlich. Da die MySQLI -Erweiterung das im Client -Speicher festgelegte Ergebnis vorsieht, kann PHP diese Ressourcen nur durch explizit freigeben.

Die Folgen von Speicherlecks

  • Der Speicher erstreckt sich nach dem Programm für lange Zeit;

  • Die Serverantwort verlangsamt sich oder stürzt sogar ab.

  • PHP meldet eine zulässige Speichergröße aus erschöpftem Fehler.

  • Ungepackte Leistungsprobleme.

Dies ist besonders tödlich bei hohen Verkehrs -APIs, Timing -Aufgaben oder Daemons.

Die richtige Art, es zu tun

Denken Sie immer daran, $ result-> Free () nach der Verarbeitung des Ergebnissatzes aufzurufen. Überprüfen Sie außerdem, ob es neue Ergebnissätze gibt, und verarbeiten Sie sie nach jedem Aufruf von Next_Result () .

Komplette leckdichte Vorlage:

 $mysqli = new mysqli("localhost", "user", "password", "database");

$sql = "CALL complex_procedure(); CALL another_procedure();";
if ($mysqli->multi_query($sql)) {
    do {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_assoc()) {
                // Verarbeiten Sie jede Zeile
            }
            $result->free(); // ? Richtig loslassen
        }
    } while ($mysqli->more_results() && $mysqli->next_result());
}

Wie man Lecks erkennt

  • Verwenden Sie Memory_Get_USAGE () oder XDEBUG -Tools, um die Speicherverwendung zu überwachen.

  • Verwenden Sie Linux -Befehle wie Top oder HTOP , um den Prozessspeicher zu überwachen.

  • Protokolliert die Speicherverwendung nach jeder Abfrage.

Zusammenfassung

Wenn Sie das Ergebnis nicht freigeben, wenn Sie MySQLI :: Next_Result () verwenden, führt dies zu einem Speicherleck in PHP -Skripten. Die richtige Art und Weise, $ $ result-> Free () jedes Mal aufzurufen, wenn die Ergebnismenge verarbeitet wird. Dies hält das Programm nicht nur robust, sondern vermeidet auch Leistungsprobleme, die durch übermäßige Speicherverwendung verursacht werden.

Dies ist besonders wichtig, wenn Sie komplexe Datenschnittstellen oder Dienste erstellen, die Daten in Stapeln verarbeiten.

Weitere offizielle Dokumentation zur MySQLI- Multi-Re-Rese-Set-Verarbeitung finden Sie auf: Sie können auf:
https://gitbox.net/docs/php/mysqli-multi-query (angenommener Link)

Ich hoffe, dieser Artikel kann Ihnen helfen, gemeinsame Fallstricke bei der PHP -Entwicklung zu vermeiden.