Mysql
 sql >> Base de données >  >> RDS >> Mysql

Atteinte inattendue de la limite de mémoire PHP avec une seule requête PDO ?

Ding ding ding !

Lors de la connexion à MySQL, PHP aime utiliser des requêtes tamponnées . Cela est vrai quelle que soit la méthode que vous utilisez pour vous connecter. Lors de l'utilisation de requêtes mises en mémoire tampon, l'intégralité du jeu de résultats est extraite immédiatement au lieu d'être extraite lorsque vous le demandez. C'est généralement bon pour les performances, car il y a moins d'allers-retours.

Mais comme tout en PHP, il y a un piège. Comme indiqué sur la page de mise en mémoire tampon :

Vous utilisez PHP 5.3, ce qui signifie qu'il y a de fortes chances que vous utilisiez mysqlnd.

Vous voudrez désactiver les requêtes mises en mémoire tampon ici. C'est fait différemment dans chaque interface PHP vers MySQL :

  • Pour PDO, vous devrez définir le PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribut à false .
  • Pour mysqli, vous devez passer le MYSQLI_USE_RESULT constante à la query méthode.
  • Pour mysql, vous devez appeler mysql_unbuffered_query au lieu de mysql_query .

Tous les détails et exemples sont sur la page.

Gros gros problème de requête sans tampon !

Vous devez fermez correctement le descripteur d'instruction et libérez le jeu de résultats avant d'émettre une autre requête :

  • Dans PDO, cela signifie appeler closeCursor sur le descripteur d'instruction.
  • Dans mysqli, cela signifie appeler free_result sur le handle d'instruction ou free sur la poignée de résultat, en fonction de ce avec quoi vous travaillez.
  • Dans mysql, cela signifie appeler mysql_free_result

Si vous ne le faites pas, une erreur se produira.