Maison >développement back-end >tutoriel php >Exemples d'optimisation de la mémoire lors de l'utilisation de PHP pour un grand nombre de boucles

Exemples d'optimisation de la mémoire lors de l'utilisation de PHP pour un grand nombre de boucles

*文
*文original
2017-12-28 15:44:502741parcourir

Parfois, nous devons traiter une grande quantité de données. Trop de boucles peuvent entraîner un épuisement de la mémoire. Comment résoudre ce problème ? L'éditeur ci-dessous vous aidera à résoudre le problème d'épuisement de la mémoire lors du bouclage d'une grande quantité de données en PHP. Les amis dans le besoin peuvent s'y référer. J'espère que cela aide tout le monde.

J'ai récemment rencontré le problème suivant lors du développement d'un programme PHP :

Erreur fatale PHP : taille de mémoire autorisée de 268 435 456 octets épuisée

Le Le message d'erreur indique que la mémoire maximale autorisée a été épuisée. J'ai été surpris de rencontrer une telle erreur au début, mais après y avoir réfléchi, ce n'est pas surprenant, car le programme que je développe consiste à utiliser une instruction de boucle foreach pour rechercher des caractéristiques spécifiques dans une table contenant 40 000 enregistrements de données. c'est-à-dire qu'il faut extraire 40 000 données à la fois, puis vérifier les données quotidiennes une par une. Il est concevable que si les 40 000 données étaient chargées dans la mémoire, il serait étrange que la mémoire n'éclate pas.

Après toutes ces années de programmation, je me souviens vaguement que PHP fournit une API qui ne charge pas les données en une seule fois. C'est comme traiter un contenu multimédia en streaming. perdez des données au fur et à mesure. Méthodes de requête qui ne s’accumulent pas en mémoire. Après une simple recherche, j'ai trouvé l'utilisation correcte sur le site officiel.

Ce problème est appelé Requêtes tamponnées et non tamponnées sur le site officiel de PHP. Le mode de requête par défaut de PHP est le mode tamponné. En d’autres termes, les résultats des données de la requête seront extraits en mémoire d’un seul coup pour être traités par le programme PHP. Cela donne au programme PHP des fonctions supplémentaires, telles que compter le nombre de lignes, pointer le pointeur vers une certaine ligne, etc. Ce qui est plus important, c'est que le programme peut effectuer à plusieurs reprises des requêtes secondaires et des opérations de filtrage sur l'ensemble de données. Cependant, l’inconvénient de ce mode de requête tamponné est qu’il consomme de la mémoire, c’est-à-dire qu’il échange de l’espace contre de la vitesse.

En revanche, un autre mode de requête PHP est une requête sans tampon. Le serveur de base de données renverra les données une par une au lieu de toutes en même temps. Le résultat est que le programme PHP consomme moins de mémoire, mais augmente la mémoire. consommation. La pression sur le serveur de base de données, car la base de données attendra que PHP récupère les données jusqu'à ce que toutes les données soient récupérées.

Évidemment, le mode de requête tamponné convient aux requêtes avec de petits volumes de données, tandis que les requêtes non tamponnées conviennent aux requêtes avec de gros volumes de données.

Tout le monde connaît la requête en mode tamponné de PHP. L'exemple ci-dessous montre comment exécuter l'API de requête non tamponnée.

Première méthode de requête sans tampon : mysqli


<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 
$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT); 
if ($uresult) { 
  while ($row = $uresult->fetch_assoc()) { 
    echo $row[&#39;Name&#39;] . PHP_EOL; 
  } 
} 
$uresult->close(); 
?>


Méthode de requête sans tampon deux : pdo_mysql


<?php 
$pdo = new PDO("mysql:host=localhost;dbname=world", &#39;my_user&#39;, &#39;my_pass&#39;); 
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); 

$uresult = $pdo->query("SELECT Name FROM City"); 
if ($uresult) { 
  while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) { 
    echo $row[&#39;Name&#39;] . PHP_EOL; 
  } 
} 
?>


Troisième méthode de requête sans tampon : mysql


<?php 
$conn = mysql_connect("localhost", "my_user", "my_pass"); 
$db  = mysql_select_db("world"); 

$uresult = mysql_unbuffered_query("SELECT Name FROM City"); 
if ($uresult) { 
  while ($row = mysql_fetch_assoc($uresult)) { 
    echo $row[&#39;Name&#39;] . PHP_EOL; 
  } 
} 
?>


Recommandations associées :

php lit le contenu du fichier dans une boucle

Méthode de mise en mémoire tampon de contrôle du temps de boucle PHP_Tutoriel PHP

Notes sur la structure syntaxique de base des instructions de boucle PHP_Tutoriel PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn