## 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;
    }
    ?>

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open