Position actuelle: Accueil> Derniers articles> Comment éviter les fuites de mémoire lors de l'utilisation de la fonction fetch_object? Fetch_Object Memory Management Skills Explication Explication

Comment éviter les fuites de mémoire lors de l'utilisation de la fonction fetch_object? Fetch_Object Memory Management Skills Explication Explication

M66 2025-06-22

Dans le développement de PHP, il est très courant d'utiliser la fonction fetch_object pour obtenir un résultat défini sous la forme d'un objet à partir d'une base de données. Il permet aux développeurs de manipuler des données d'une manière orientée objet, et la structure du code est plus claire. Cependant, dans des scripts à haute concurrence ou à long terme, si les ressources d'objet renvoyées par fetch_object ne sont pas correctement gérées, il est facile de provoquer une fuite de mémoire, ce qui affectera éventuellement les performances du système et provoquera même des accidents.

Cet article commencera par le principe de travail de fetch_object , analysera les causes des fuites de mémoire en profondeur et fournira des compétences pratiques en matière de gestion de la mémoire pour vous aider à écrire un code PHP plus robuste et plus efficace.


1. Introduction à la fonction fetch_object

fetch_object est l'une des méthodes de la classe mysqli_result dans PHP, qui est utilisée pour convertir un enregistrement dans le résultat défini en un objet. L'exemple est le suivant:

 $mysqli = new mysqli("m66.net", "user", "password", "database");
$result = $mysqli->query("SELECT * FROM users");

while ($obj = $result->fetch_object()) {
    echo $obj->username . "<br>";
}

Ici, chaque fois que Fetch_Object est appelé, une nouvelle instance d'objet est renvoyée, qui contient les données de la ligne actuelle.


2. Causes courantes de fetch_object fuite de mémoire

  1. Les ressources de définition des résultats non publiées dans le temps <br> Si les résultats de la requête ne sont pas publiés pendant longtemps, MySQLI_RESULT occupera beaucoup de mémoire. Bien que le script PHP soit automatiquement nettoyé à la fin de la fin, il doit être libéré manuellement dans de longs scripts ou démons.

  2. Un grand nombre d'objets ont été créés dans une boucle et non détruits dans le temps
    fetch_object crée de nouveaux objets en continu, et si ces objets sont référencés à l'extérieur ou stockés dans un tableau et ne sont pas nettoyés, la mémoire continuera de croître.

  3. Les références d'objets complexes entraînent le recyclage de la mémoire <br> Lorsque les objets obtenus par Fetch contiennent des attributs qui se réfèrent à d'autres grandes ressources ou que les objets se réfèrent les uns aux autres, le mécanisme de collecte des ordures PHP peut ne pas être recyclé dans le temps, entraînant une accumulation de mémoire.


3. Fetch_Object Memory Management Practical Skills

1. Utilisez libre () pour libérer l'ensemble de résultats

Une fois la requête terminée, appelez $ result-> free () à temps pour libérer des ressources pour éviter la consommation continue de mémoire:

 $result = $mysqli->query("SELECT * FROM users");
while ($obj = $result->fetch_object()) {
    // Traitement des données
}
$result->free();

2. Détruisez des objets qui ne sont plus utilisés en temps opportun

Si vous enregistrez le résultat de fetch_object dans un tableau, après traitement, effacez explicitement le tableau:

 $objects = [];
while ($obj = $result->fetch_object()) {
    $objects[] = $obj;
}
// Traiter tous les objets
unset($objects);
$result->free();

Cela peut aider PHP à recycler la mémoire plus rapidement.

3. Évitez de créer un grand nombre de références persistantes dans une boucle

Si vous n'avez pas besoin d'enregistrer des objets pendant longtemps, essayez de libérer la référence après le traitement dans la boucle pour éviter l'accumulation d'objets.

4. Envisagez d'utiliser Fetch_assoc à la place

Si la pression de mémoire est élevée, vous pouvez utiliser fetch_assoc () , renvoyez un tableau au lieu d'un objet et réduire l'utilisation de la mémoire:

 while ($row = $result->fetch_assoc()) {
    // Accéder aux données à l&#39;aide du tableau
}

Bien que le style de code soit différent, il est adapté à la mémoire.


4. Exemple de code complet

 <?php
$mysqli = new mysqli("m66.net", "user", "password", "database");

if ($mysqli->connect_error) {
    die("Échec de la connexion:" . $mysqli->connect_error);
}

$result = $mysqli->query("SELECT * FROM users");
if ($result) {
    while ($obj = $result->fetch_object()) {
        echo "nom d&#39;utilisateur: " . $obj->username . "<br>";
        // S&#39;il n&#39;est pas stocké après le traitement,Variables de libération directement
        unset($obj);
    }
    // Libérez l&#39;ensemble de résultats
    $result->free();
} else {
    echo "La requête a échoué:" . $mysqli->error;
}

$mysqli->close();
?>

5. Résumé

  • fetch_object est pratique pour la manipulation des données, mais la création d'un grand nombre d'objets entraînera une pression de mémoire.

  • Vous devez développer l'habitude de libérer des ensembles de résultats et de détruire des objets pour éviter les fuites de mémoire.

  • En combinant Fetch_assoc et des stratégies de gestion de la mémoire appropriées, l'utilisation de la mémoire des scripts PHP peut être contrôlée efficacement.

  • Pour les scripts de longue date, faites une attention particulière à la surveillance et à la gestion de la mémoire.

La maîtrise des compétences ci-dessus peut rendre votre programme PHP plus stable et efficace lors du traitement de grandes quantités de données, en évitant les goulots d'étranglement des performances causés par des fuites de mémoire.