RequĂȘtes mises ou non en mĂ©moire tampon
Les requĂȘtes utilisent par dĂ©faut le mode MĂ©moire tampon.
Cela signifie que le rĂ©sultat des requĂȘtes est immĂ©diatement
transféré du serveur MySQL à PHP et est ensuite conservé dans la mémoire
du processus PHP. Cela permet des opérations complémentaires
comme compter le nombre de résultats, et déplacer le
pointeur de résultat actuel. Il permet également d'exécuter des
requĂȘtes supplĂ©mentaires sur la mĂȘme connexion tout en travaillant
sur le jeu de résultats. L'inconvénient de la mise en mémoire
tampon est que des jeux de résultats importants peuvent demander
beaucoup plus de mémoire. La mémoire restera occupée jusqu'à ce
que toutes les références sur les jeux de résultats soient
désactivées ou que les jeux de résultats soient explicitement
libérés, ce qui arrive de maniÚre automatique à la fin du
processus. La terminologie "store result" est également utilisée
avec le mode mémoire tampon, vu que la totalité des résultats
est stockée en une seule fois.
Note:
Lorsqu'on utilise libmysqlclient comme bibliothĂšque, la limite
mémoire de PHP ne comptera pas la mémoire utilisée pour les
jeux de résultats à moins que les données ne soient lues dans les
variables PHP. Avec mysqlnd, la mémoire utilisée comprendra
le jeu de résultats complet.
Les requĂȘtes n'utilisant pas la mĂ©moire tampon, les requĂȘtes
MySQL exĂ©cutent leur requĂȘte et puis attendent
que les données du serveur MySQL soient récupérées. Cela utilise moins de mémoire
cÎté PHP, mais peut augmenter la charge
sur le serveur. à moins que le jeu de résultats complet ait été
rĂ©cupĂ©rĂ© depuis le serveur, aucune autre requĂȘte ne peut ĂȘtre
envoyĂ©e sur la mĂȘme connexion. Les requĂȘtes n'utilisant pas la
mémoire tampon peuvent également faire référence à un
"use result". Une fois que toutes les lignes de l'ensemble de résultats
ont été récupérées, l'ensemble de résultats disparaßt et il n'est plus possible de le parcourir à nouveau.
Suivant ces caractĂ©ristiques, les requĂȘtes non mises en mĂ©moire tampon doivent ĂȘtre utilisĂ©es uniquement
lorsqu'on s'attend à obtenir un grand ensemble de résultats qui sera traité séquentiellement.
Les requĂȘtes non mises en mĂ©moire tampon prĂ©sentent plusieurs piĂšges qui les rendent plus
difficiles à utiliser, par exemple le nombre de lignes dans l'ensemble de résultats n'est pas connu
avant que la derniÚre ligne ne soit récupérée.
En raison du fait que les requĂȘtes sont mises en mĂ©moire tampon
par défaut, les exemples ci-dessous vont montrer comment
exĂ©cuter des requĂȘtes, avec chaque API, sans mise en mĂ©moire
tampon.
Exemple #1 Exemple de requĂȘtes n'utilisant pas la mĂ©moire tampon : mysqli
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$unbufferedResult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);
foreach ($unbufferedResult as $row) {
echo $row['Name'] . PHP_EOL;
}
?>
Exemple #2 Exemple de requĂȘtes n'utilisant pas la mĂ©moire tampon : pdo_mysql
<?php
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_password');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$unbufferedResult = $pdo->query("SELECT Name FROM City");
foreach ($unbufferedResult as $row) {
echo $row['Name'] . PHP_EOL;
}
?>