PDO et mémoire
Posté : 23 août 2011, 03:13
Bonjour à tous,
Encore un problème que je n'ai pas réussi à résoudre. En lisant les détails des fonctions de l'API C de MySQL, l'extension mysql de PHP et PDO, je trouve des détails qui ne me semblent pas cohérents.
-> l'API de MySQL indique deux modes de récupération des données : l'une qui récupère ligne après ligne, et l'autre tout d'un coup. Il est aussi indiqué que dans le cas de ligne après ligne, il est obligatoire de terminer l'opération de récupération pour fermer la requête (je n'ai pas la doc sous les yeux, mais en gros c'est ça). Il est aussi indiqué qu'il n'est pas possible de connaître le nombre de résultats d'un SELECT pour la récupération ligne après ligne.
-> PDO indique que closeCursor() permet justement de fermer cette requête, soit avec (d'après ce que j'ai compris) une méthode adaptée au driver, soit, et c'est montré en exemple, en récupérant les lignes jusqu'à la dernière (sauf quelque driver qui ne le permettrait pas). Toutefois, il parait tout à fait capable de retourner le nombre de résultats d'un SELECT, et ne précise pas sa propre méthode de récupération.
-> Mysql permet de récupérer le nombre de résultats (c'est clairement dit que c'est possible pour un SELECT), et il existe mysql_unbuffered_query qui semble se comporter en lecture ligne après ligne, je cite "envoie la requête SQL query à MySQL sans automatiquement récupérer et mettre en mémoire les lignes du résultat, comme pourrait le faire la fonction mysql_query()."
Alors, si l'extension récupère l'ensemble des lignes du résultat, en quoi fetchAll() est-il mauvais pour la mémoire, puisque les résultats sont déjà dans l'extension ? Est-ce que la mémoire occupée par l'extension n'est pas prise en compte par la mémoire maximale d'un script php et donc c'est par rapport à cela ? Car d'après pas mal de tuto, ils ne le précisent pas et l'on peut penser que c'est de façon générale, sur le serveur client mysql (le même où tourne php) que cela peut poser un problème, et non pour la mémoire max d'un script. Exemple de la doc PHP sur PDO : "L'utilisation de cette méthode pour récupérer de gros jeux de résultats peut augmenter les ressources du système, mais également ces ressources". Ressources système c'est pas script php pour moi ...
Quelque chose m'échappe, peut-être ?
Pas mal de choses qui sont liées ne sont pas claires, pour le moment je commence avec celle-là. En gros, ça serait bien de savoir quand et où sont stockées les résultats, en fonction de ce que l'on fait ...
PS : Comme d'habitude avec moi, tout article externe est la bienvenue.
Encore un problème que je n'ai pas réussi à résoudre. En lisant les détails des fonctions de l'API C de MySQL, l'extension mysql de PHP et PDO, je trouve des détails qui ne me semblent pas cohérents.
-> l'API de MySQL indique deux modes de récupération des données : l'une qui récupère ligne après ligne, et l'autre tout d'un coup. Il est aussi indiqué que dans le cas de ligne après ligne, il est obligatoire de terminer l'opération de récupération pour fermer la requête (je n'ai pas la doc sous les yeux, mais en gros c'est ça). Il est aussi indiqué qu'il n'est pas possible de connaître le nombre de résultats d'un SELECT pour la récupération ligne après ligne.
-> PDO indique que closeCursor() permet justement de fermer cette requête, soit avec (d'après ce que j'ai compris) une méthode adaptée au driver, soit, et c'est montré en exemple, en récupérant les lignes jusqu'à la dernière (sauf quelque driver qui ne le permettrait pas). Toutefois, il parait tout à fait capable de retourner le nombre de résultats d'un SELECT, et ne précise pas sa propre méthode de récupération.
-> Mysql permet de récupérer le nombre de résultats (c'est clairement dit que c'est possible pour un SELECT), et il existe mysql_unbuffered_query qui semble se comporter en lecture ligne après ligne, je cite "envoie la requête SQL query à MySQL sans automatiquement récupérer et mettre en mémoire les lignes du résultat, comme pourrait le faire la fonction mysql_query()."
Alors, si l'extension récupère l'ensemble des lignes du résultat, en quoi fetchAll() est-il mauvais pour la mémoire, puisque les résultats sont déjà dans l'extension ? Est-ce que la mémoire occupée par l'extension n'est pas prise en compte par la mémoire maximale d'un script php et donc c'est par rapport à cela ? Car d'après pas mal de tuto, ils ne le précisent pas et l'on peut penser que c'est de façon générale, sur le serveur client mysql (le même où tourne php) que cela peut poser un problème, et non pour la mémoire max d'un script. Exemple de la doc PHP sur PDO : "L'utilisation de cette méthode pour récupérer de gros jeux de résultats peut augmenter les ressources du système, mais également ces ressources". Ressources système c'est pas script php pour moi ...
Quelque chose m'échappe, peut-être ?
Pas mal de choses qui sont liées ne sont pas claires, pour le moment je commence avec celle-là. En gros, ça serait bien de savoir quand et où sont stockées les résultats, en fonction de ce que l'on fait ...
PS : Comme d'habitude avec moi, tout article externe est la bienvenue.