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.
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.
$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 .
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.
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.
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 () .
$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());
}
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.
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.