Question sur mysql_free_result

Utilisation de mysql_free_result

Vous pouvez sélectionner 1 option
4
21%
9
47%
2
11%
4
21%
 
Nombre total de votes : 19
 
Eléphant du PHP | 447 Messages

20 juil. 2009, 14:01

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?
Probably (only a) Human Problem?

Mammouth du PHP | 965 Messages

20 juil. 2009, 14:08

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.

Eléphant du PHP | 245 Messages

20 juil. 2009, 15:42

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 juil. 2009, 16:45

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 19672 Messages

20 juil. 2009, 17:02

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 447 Messages

20 juil. 2009, 21:36

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()...
Probably (only a) Human Problem?

ViPHP
AB
ViPHP | 5818 Messages

21 juil. 2009, 17:06

... 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.

Eléphant du PHP | 447 Messages

22 juil. 2009, 14:15

Hi AB, est-ce que tu pourrais me donner un petit exemple stp?
Probably (only a) Human Problem?

ViPHP
AB
ViPHP | 5818 Messages

23 juil. 2009, 03:34

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

Eléphant du PHP | 447 Messages

23 juil. 2009, 10:14

okaaaay, merci pour l'exemple! en fait ma préoccupation c'était de savoir comment et où utiliser la fonction...
Probably (only a) Human Problem?

Eléphant du PHP | 245 Messages

23 juil. 2009, 12:14

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.

ViPHP
AB
ViPHP | 5818 Messages

25 juil. 2009, 04:27

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.
Modifié en dernier par AB le 25 juil. 2009, 05:00, modifié 1 fois.

Eléphant du PHP | 447 Messages

25 juil. 2009, 04:47

Ok! :wink:
Probably (only a) Human Problem?

ViPHP
AB
ViPHP | 5818 Messages

25 juil. 2009, 05:04

Juste pour te dire que j'avais édité mon précédent message pour le compléter... :wink:

Eléphant du PHP | 447 Messages

25 juil. 2009, 05:24

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... :)
Probably (only a) Human Problem?