Bei der Verwendung von PHP zum Betrieb von MySQL -Datenbanken sind viele Entwickler daran gewöhnt, MySQLI -Erweiterungen zur Durchführung von Datenbankvorgängen zu verwenden. Viele Menschen ignorieren jedoch ein Detail: Nach der Frage. Sie könnten fragen, ob $ result-> free () (oder mysqli_free_result () ) wirklich so wichtig ist? Warum kann es nicht weggelassen werden? Dieser Artikel wird ausführlich erörtert.
Wenn Sie mySQLI_Query () verwenden, um eine Abfrageanweisung auszuführen, zum Beispiel:
$mysqli = new mysqli("localhost", "username", "password", "database");
$result = $mysqli->query("SELECT * FROM users");
Das $ Ergebnis hier ist ein MySQLi_Result -Objekt, das alle von der Abfrage zurückgegebenen Daten speichert. Es verbraucht Speicherressourcen , insbesondere wenn die Abfrageergebnisse groß sind, und der Speicherverbrauch steigt erheblich an.
Viele Leute denken, dass PHP den Speicher automatisch verwaltet und automatisch Variablen bereinigt, wenn das Skript endet. Aber Tatsache ist:
? Der Speicher wird automatisch gereinigt, wenn das Skript endet.
? Wenn Sie jedoch während des Skripts mehrere Abfragen oder große Abfragen haben und sie nicht aktiv freigeben, wird der Speicherdruck immer größer.
Zum Beispiel:
for ($i = 0; $i < 1000; $i++) {
$result = $mysqli->query("SELECT * FROM big_table");
// Es wird kein Ergebnissatz veröffentlicht
}
Im obigen Code generiert jede Schleife ein Ergebnis -Set -Objekt, wird jedoch nicht veröffentlicht. Dadurch wird der Speicher steigern, was schließlich zu einem Speicherüberlauf oder der Leistungsabfälle führen kann.
Wenn Sie $ result-> Free () hinzufügen:
for ($i = 0; $i < 1000; $i++) {
$result = $mysqli->query("SELECT * FROM big_table");
$result->free();
}
Auf diese Weise wird am Ende jeder Schleife der Speicher, der durch das Ergebnissatz besetzt ist, rechtzeitig freigegeben, wodurch die Speicherverwendung stark verringert wird.
Es gibt zwei Möglichkeiten:
1 ?? Objektorientierter Stil:
$result = $mysqli->query("SELECT * FROM users");
if ($result) {
// Verarbeitungsergebnisse...
$result->free();
}
2 ?? Prozessstil:
$result = mysqli_query($mysqli, "SELECT * FROM users");
if ($result) {
// Verarbeitungsergebnisse...
mysqli_free_result($result);
}
Hinweis: Wenn die Abfrage fehlschlägt (Rückgabe falsch ), meldet das Aufrufen von Free () einen Fehler, sodass Sie zunächst feststellen müssen, ob $ result ein gültiges Objekt ist.
Möglicherweise spüren Sie den Unterschied mit kurzen Skripten und einer einzelnen Abfrage nicht. In diesen Szenarien wird es jedoch schwerwiegende Folgen haben, die Ergebnismenge nicht zu veröffentlichen:
Big Data -Abfrage: Beim Abfragen von Zehntausenden oder Hunderttausenden Zeilen wird das Ergebnis -Set viel Speicher einnimmt.
Langlebige Skripte: zeitgesteuerte Aufgaben, Crawler und Daemons.
Hoher gleichzeitiger Webdienst: Jede Anforderung verbraucht Speicher und zieht den Server für lange Zeit nach unten.
In diesen Fällen wird das Ergebnissatz nicht veröffentlicht, und die Anwendung kann mindestens verlangsamt werden und der Server kann im schlimmsten Fall abgestürzt werden.
Denken Sie an einen Satz: Gebrauchte Ressourcen müssen manuell veröffentlicht werden!
Selbst wenn PHP den Speicher automatisch recycelt, verlassen Sie sich nicht darauf, um die Ressourcen zu verwalten.
In der tatsächlichen Entwicklung ist die Entwicklung guter Gewohnheiten - $ result-> Free () nach Abfragen rechtzeitig und nicht nur "richtiger" Code, sondern auch "gute" Code.