Position actuelle: Accueil> Derniers articles> Comment éviter efficacement le problème de débordement de la mémoire PHP via la fonction mysqli :: use_result?

Comment éviter efficacement le problème de débordement de la mémoire PHP via la fonction mysqli :: use_result?

gitbox 2025-08-27
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// Cette partie du code n&#39;a rien à voir avec le contenu de l&#39;article,Seulement par exemple en place d&#39;espace</span></span><span>

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Bienvenue à lire cet article,Cet article discutera de la façon de l&#39;utilisermysqli::use_resultÉvitement de la fonctionPHPProblème de débordement de mémoire。"</span></span><span>;

</span><span><span class="hljs-meta">?&gt;</span></span><span>

&lt;hr&gt;

</span><span><span class="hljs-meta">&lt;?php</span></span><span>
<span class="hljs-comment">/*
 * Comment passermysqli::use_resultLes fonctions sont effectivement évitéesPHPProblème de débordement de mémoire?
 *
 * existerPHPmilieu,utiliserMySQLLorsque la base de données,Il y a souvent des problèmes de débordement de mémoire lorsque l&#39;ensemble de résultats de requête est important。特别是当utilisermysqliÉtendre l&#39;exécution de la requête des grands ensembles de résultats,
 * Si tous les résultats sont chargés en mémoire à la fois,Très facile à provoquerPHPMémoire épuisée,Crash du programme。
 *
 * mysqliFournit deux façons d&#39;obtenir les résultats de la requête:store_result()etuse_result()。
 * 
 * 1. store_result():
 *    Méthode par défaut,会将整个结果集一次性取回并缓存exister客户端内存milieu。
 *    Pour un grand volume de données,Très grande consommation de mémoire。
 * 
 * 2. use_result():
 *    utiliser"Niveau de rangée"Comment obtenir,Ne récupérera pas tous les résultats à la fois,Au lieu de cela, lisez les données via le réseau。
 *    这样可以显著降低内存utiliser,Évitez le débordement de la mémoire。
 *
 * 本文重点讲解如何合理utilisermysqli::use_result()避免Problème de débordement de mémoire。
 */</span>

<span class="hljs-comment">/**
 * utilisermysqli::use_resultExemple de code pour
 */</span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">'localhost'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>, </span><span><span class="hljs-string">'database'</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_errno) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Échec de la connexion: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// Exécuter une requête</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">real_query</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM large_table"</span></span><span>)) {

    </span><span><span class="hljs-comment">// passeruse_resultObtenez l&#39;ensemble de résultats,Évitez de charger de grandes quantités de données à la fois</span></span><span>
    </span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">use_result</span></span><span>();

    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span>) {
        </span><span><span class="hljs-comment">// Traiter les données ligne par ligne,Réduire l&#39;utilisation de la mémoire</span></span><span>
        </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
            </span><span><span class="hljs-comment">// Traiter chaque rangée de données,Par exemple, sortir ou écrire dans un fichier</span></span><span>
            </span><span><span class="hljs-comment">// echo $row['column_name'] . PHP_EOL;</span></span><span>
        }

        </span><span><span class="hljs-comment">// Ressourne des résultats de la version Ressources</span></span><span>
        </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">free</span></span><span>();
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Échec de l&#39;obtention des résultats:"</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;error;
    }

} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"La requête a échoué:"</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;error;
}

</span><span><span class="hljs-comment">// Fermer la connexion</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();

<span class="hljs-comment">/*
 * Description détaillée:
 *
 * 1. Lecture de streaming:
 *    utiliseruse_result(),MySQLLe serveur n&#39;enverra pas les résultats au client à la fois,Au lieu de cela, gardez la connexion,
 *    Faire lire le client en ligne。这样避免了大量数据exister内存milieu积累。
 * 
 * 2. Choses à noter:
 *    - existerutiliseruse_result()heure,Tous les résultats ou appels doivent être lus en premierfree(),Ce n&#39;est qu&#39;alors que la nouvelle requête peut être exécutée。
 *    - Je ne peux pas être mélangéstore_result()etuse_result(),Évitez le blocage de connexion。
 *    - La connexion réseau doit être maintenue,读取过程不能milieu断。
 *
 * 3. Comparaison des performances:
 *    contrastestore_result(),use_result()Sacrifie une certaine performance(Nécessite plusieurs interactions réseau),
 *    但显著减少了内存utiliser,Convient pour les grands scénarios de données。
 *
 * 4. Scénarios applicables:
 *    - Les résultats de la requête sont très importants,Impossible de charger tout de suite。
 *    - Besoin de traiter les résultats en morceaux,Si vous écrivez dans un fichier、Exportation de pagination, etc.。
 *
 * Résumer:
 * utilisermysqli::use_result()Implémenter la requête en streaming,Oui, évitezPHPUne stratégie efficace pour le débordement de la mémoire。
 * Il permet aux développeurs d&#39;obtenir des données ligne par ligne,降低内存峰值utiliser,Cela améliore la stabilité du programme。
 */</span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>
  • Étiquettes associées:

    mysqli