Lorsque vous utilisez PHP pour faire fonctionner les bases de données MySQL, de nombreux développeurs sont habitués à utiliser des extensions MySQLI pour effectuer des opérations de base de données. Cependant, beaucoup de gens ignorent un détail: après la requête. Vous pourriez demander, $ result-> free () (ou mysqli_free_result () ) vraiment si important? Pourquoi ne peut-il pas être omis? Cet article sera discuté en détail.
Lorsque vous utilisez mysqli_query () pour exécuter une instruction de requête, par exemple:
$mysqli = new mysqli("localhost", "username", "password", "database");
$result = $mysqli->query("SELECT * FROM users");
Le résultat $ ici est un objet mysqli_result , qui stocke toutes les données renvoyées par la requête. Il consomme des ressources de mémoire , en particulier lorsque les résultats de la requête sont importants, la consommation de mémoire augmente considérablement.
Beaucoup de gens pensent que PHP gère automatiquement la mémoire et nettoiera automatiquement les variables à la fin du script. Mais le fait est:
? La mémoire sera automatiquement nettoyée à la fin du script.
? Mais pendant le script en cours d'exécution, si vous avez plusieurs requêtes ou de grandes requêtes et ne les libérez pas activement, la pression de la mémoire deviendra de plus en plus grande.
Par exemple:
for ($i = 0; $i < 1000; $i++) {
$result = $mysqli->query("SELECT * FROM big_table");
// Aucun ensemble de résultats n'est publié
}
Dans le code ci-dessus, chaque boucle générera un objet SET de résultats, mais il n'est pas publié. Cela maintiendra la mémoire de la mémoire, ce qui peut éventuellement entraîner un débordement de mémoire ou des baisses de performances .
Si vous ajoutez $ result-> gratuit () :
for ($i = 0; $i < 1000; $i++) {
$result = $mysqli->query("SELECT * FROM big_table");
$result->free();
}
De cette façon, à la fin de chaque boucle, la mémoire occupée par l'ensemble de résultats sera publiée dans le temps, réduisant considérablement l'utilisation de la mémoire.
Il y a deux façons:
1 ?? Style orienté objet:
$result = $mysqli->query("SELECT * FROM users");
if ($result) {
// Résultats de traitement...
$result->free();
}
2 ?? Style de processus:
$result = mysqli_query($mysqli, "SELECT * FROM users");
if ($result) {
// Résultats de traitement...
mysqli_free_result($result);
}
Remarque: si la requête échoue (renvoie false ), l'appel libre () rapportera une erreur, vous devez donc déterminer si $ le résultat est un objet valide.
Vous ne ressentez peut-être pas la différence avec les scripts courts et la requête unique. Cependant, dans ces scénarios, il y aura des conséquences graves pour ne pas publier l'ensemble de résultats:
Big Data Query: Lorsque vous interrogez des dizaines de milliers ou des centaines de milliers de lignes, l'ensemble de résultats occupe beaucoup de mémoire.
Scripts de longue date: tels que les tâches chronométrées, les robots de robots et les démons.
Service Web simultané élevé: chaque demande consomme de la mémoire et fait glisser le serveur pendant longtemps.
Dans ces cas, l'ensemble de résultats n'est pas publié et l'application peut être ralentie au moins et le serveur peut être écrasé au pire.
N'oubliez pas une phrase: les ressources d'occasion doivent être libérées manuellement!
Même si PHP recycle automatiquement la mémoire, ne comptez pas sur lui pour gérer les ressources en cours d'exécution.
Dans le développement réel, le développement de bonnes habitudes - $ result-> free () est opportun après l'interrogation, non seulement la rédaction du code "droit", mais aussi l'écriture de "bon" code.