Page 1 sur 1

Question sur mysql_free_result

Posté : 20 juil. 2009, 14:01
par Stef
Hello,

j'aimerais avoir votre avis sur l'utilisation de mysql_free_result, car après recherche je me retrouve avec 2 point de vues contradictoires...

Dans le 1er cas, on trouve par ex. :
mysql_free_result() n'est à appeler que si vous avez peur d'utiliser trop de mémoire durant l'exécution de votre script. Toute la mémoire associée à l'identifiant de résultat sera automatiquement libérée.
src: http://fr.php.net/manual/fr/function.my ... result.php

dans le 2ème:
Toute exploitation de résultats doit être immédiatement libérée, explicitement, et ce dès lors que le résultat collecté n'est plus utile. ... Cela n'a pas lieu automatiquement, ... , il est important de ne pas oublier cette partie.
PHP5 & MySQL5 / L. Isolda & S. Magne

Qui a raison?

Posté : 20 juil. 2009, 14:08
par agité
Il me semble que la mémoire est automatiquement libéré à la fin de l'appel tout comme la connexion à la base de donnée se ferme d'elle même, mais c'est à vérifier.

Posté : 20 juil. 2009, 15:42
par enneite
alors, perso, j'utilise cette fonction après chaque requète "select", peut -être ne devrais-je l'utiliser qu'après les "grosses" requetes select...
a partir de quand une requète passe de petite à grosse?
pas évident!

je vote systematiquement mais, je ne suis pas sur que ce soit le plus judicieux.

Posté : 20 juil. 2009, 16:45
par Ryle
Ce n'est pas contradictoire, mais ta deuxième source manque un peu de précision...

PHP va liberer les ressources automatiquement, mais uniquement lorsqu'il aura atteint la fin du script, quand il est sur qu'elles ne sont plus utilisées.

Si tu as besoin de libérer ces ressources avant la fin du script, c'est à toi de le spécifier explicitement car php, ne sachant pas si tu comptes les réutiliser d'ici la fin du script, risque de ne le faire que beaucoup plus tard... :)

Il est donc effectivement recommandé de les libérer toi même pour que les ressources ne soient pas occupées inutilement... maintenant, l'exécution d'un script se jouant souvent en quelques dixièmes de secondes, ça changera pas grand chose... c'est donc une bonne habitude à prendre, mais ça n'est pas systématiquement nécessaire :)

Posté : 20 juil. 2009, 17:02
par Cyrano
Salut,
personnellement, je ne vois pas quoi rajouter à ce que vient de mentionner Ryle sauf peut-être sur un petit détail : selon le volume de données traitées, ça peut prendre une certaine importance. Si tu traites par paquets de 10, voire même 50 ou 100 lignes de données, ça ne changera pas grand chose. Mais si tes programmes traitent des paquets de plusieurs milliers de lignes à chaque requête, les délais d'exécution pourraient s'en trouver notablement améliorés par une gestion de la mémoire mieux définie et l'utilisation de cette fonction serait éventuellement tout à fait justifiée.

Posté : 20 juil. 2009, 21:36
par Stef
yeehouuuuu, j'viens de comprendre, j'avais pas pensé à ça en fait: pour moi dans tous les cas (spécifié ou pas par le code* les ressources étaient libérées à la fin seulement;
d'où la réflexion intéressante de Cyranno quant à la quantité de données traitées, et cela s'ajoute comme critère (d'utilisation ou non de la libération des ressources) au critère de la durée de traitement tel que tu le soulignes justement ryle.


* c'est vrai que jusqu'à présent j'envisageais l'utilisation de la fonction uniquement à la fin de mon code sous la forme que j'appelle "générale", sans paramètres: mysql_free_result()...

Posté : 21 juil. 2009, 17:06
par AB
... c'est vrai que jusqu'à présent j'envisageais l'utilisation de la fonction uniquement à la fin de mon code sous la forme que j'appelle "générale", sans paramètres: mysql_free_result()...
Dans ce cas là effectivement cela ne servirait à rien.

Mais par exemple, souvent pour exploiter au mieux les données d'une requête on enregistre les résultats dans un tableau.

Si la requête renvoient une grande quantité de résultat ou si les requêtes sont nombreuses, le script aura en mémoire à la fois la ressource de la requête et le contenu du tableau qui l'exploite.

Dans cet exemple le plus optimisé pour utiliser un minimum de mémoire est de libérer la ressource de la requête juste après la création du tableau.

Posté : 22 juil. 2009, 14:15
par Stef
Hi AB, est-ce que tu pourrais me donner un petit exemple stp?

Posté : 23 juil. 2009, 03:34
par AB
Hi AB, est-ce que tu pourrais me donner un petit exemple stp?
Tu n'a jamais été amené à mettre les résultats d'une requête dans un tableau pour exploiter ensuite le tableau. Si oui la ressource de la requête peut-être libérée après la création du tableau.
$query = 'SELECT ...';

$ressource = mysql_query($query);

$tab = array();

while ($resultat = mysql_fetch_assoc($ressource))

	{
        $tab['...']['...'] = $resultat['...'];
        $tab['...']['...'] = $resultat['...'];
       }

mysql_free_result($ressource);

//... suite du code

Posté : 23 juil. 2009, 10:14
par Stef
okaaaay, merci pour l'exemple! en fait ma préoccupation c'était de savoir comment et où utiliser la fonction...

Posté : 23 juil. 2009, 12:14
par enneite
généralement je fais comme le montre AB, je remplis les resultats dans un tableau, j'utilise mysql_free_result() et je ne génère le html qu'une fois le tableau rempli.

Posté : 25 juil. 2009, 04:27
par AB
En fait c'est un exemple qui est efficace surtout quand la requête comporte des jointures, sinon autant exploiter directement la ressource.

Je veux dire par là, une ressource avec de multiples jointures peut occuper beaucoup d'espace mémoire et n'est pas directement exploitable. La création d'un tableau va permettre de concentrer les informations utiles pour une meilleure exploitation des résultats et libérer cette ressource devenue inutile.

Evidemment cette méthode de création d'un tableau pour exploiter la requête, n'est intéressante (du point de vue performances) que si tu as d'autres requêtes ou fonctions qui consommeront de la mémoire par la suite. Sinon pour un simple affichage par exemple, tu pourrais tout aussi bien exploiter la ressource avec un traitement php qui fera l'équivalent avec une consommation mémoire finalement moindre.

Cela dit d'une manière générale tu peux prendre la bonne habitude de libérer la ressource d'une requête avec un mysql_free_result() dès qu'elle n'est plus utile. C'est sans problème contrairement à mysql_close() qui peux se révéler plus délicate à gérer dans certains contextes.

Posté : 25 juil. 2009, 04:47
par Stef
Ok! :wink:

Posté : 25 juil. 2009, 05:04
par AB
Juste pour te dire que j'avais édité mon précédent message pour le compléter... :wink:

Posté : 25 juil. 2009, 05:24
par Stef
ok j'viens de le relire! merci pour ces explications j'y vois plus clair, et du coup ça m'a amener à me poser d'autres questions + ou - liées (comme les jointures par ex., que j'ai toujours éludées jusqu'à présent, mais qui maintenant me paraissent intéressantes).

et sinon, oui y a aussi la question de mysql_close! je ferais un autre sondage... :)