2013-10-23 9 views
14

Ich versuche, den Unterschied zwischen $ stmt-> close() und $ stmt-> free_result() zu klären, wenn ein vorbereitet Finalisierung mysqli Aussage.


Bisher verwende ich:

$mysqli = new mysqli(host,user,password,database); 
$stmt = $mysqli->prepare(sql statement); 
[...] 
$stmt->free_result(); 
$mysqli->close(); 

und alles scheint gut zu funktionieren.

Aber ich habe gesehen, eine Menge Programmierer verwenden $ stmt-> schließen statt $ stmt-> free_result(). Und wenn ich beide gesehen habe:

$stmt->free_result(); 
$stmt->close(); 
$mysqli->close(); 

Also was soll ich wählen, unter welchen Umständen und warum?

Antwort

22

$stmt->free_result() gibt Speicher frei, der sich auf eine Ergebnismenge bezieht, während $stmt->close() Speicher freigibt, der sich auf eine vorbereitete Anweisung bezieht. Wenn Sie anschließend $stmt->close() aufrufen, werden alle noch verbleibenden Ergebnisse gelöscht.

Im Wesentlichen bietet Aufruf $stmt->close() den gleichen Effekt wie Aufruf $stmt->free_result(), da es auch die Ergebnismenge abbricht. Wenn Sie jedoch $stmt->free_result() aufrufen, wird der von der vorbereiteten Anweisung verwendete Speicher nicht gelöscht. In diesem Fall müssen Sie $stmt->close() verwenden.

Soweit das zu verwenden geht - kann es Situationen geben, in denen Sie die vorbereitete Anweisung, die Sie initialisiert haben, verwenden möchten, aber nicht mehr die Ergebnismenge benötigen, die Sie derzeit haben. In solch einem Fall würden Sie auf den Aufruf $stmt->close() warten, bis Sie mit der vorbereiteten Anweisung fertig sind und stattdessen $stmt->free_result() aufrufen, bevor Sie eine andere Anweisung ausführen.

+0

ideale Erklärung! – neophyte

2

PHP wird Ihre Verbindung beenden und die Ressource freigeben, nachdem sie ausgeführt wurde;

mysqli::closeSchließt eine vorbereitete Anweisung.

Da die Anzahl der verfügbaren Verbindungen begrenzt ist, ist die Freigabe der Ressource in der Sekunde, in der Sie damit fertig sind, eine gute Vorgehensweise.

Und

mysqli_stmt::free_resultFrees Ergebnisspeicher für die gegebene Anweisung Handle gespeichert.

Es empfiehlt sich, die Ressource explizit freizugeben, wenn Sie sie nicht mehr benötigen. Es könnte vermieden werden, eine schwere Last in den Server zu laden, wenn viele Anfragen gleichzeitig gemacht werden.

Beides ist nicht unbedingt notwendig, und es ist eine gute Übung, beide zu verwenden.