est-ce une bonne pratique à utiliser mysql_free_result($result)?
Je suis conscient du fait que Tous les associés résultat de la mémoire est libérée automatiquement à la fin du script d'exécution. Mais voulez-vous recommander de l'utiliser, si je suis à l'aide d'un assez de mal de quelque peu d'actions similaires comme ci-dessous?
$sql = "select * from products";
$result = mysql_query($sql);
if($result && mysql_num_rows($result) > 0) {
while($data = mysql_fetch_assoc($result)) {
$sql2 = "insert into another_table set product_id = '".$data['product_id']."'
, product_name = '".$data['product_name']."'
";
$result2 = mysql_query($sql2);
**mysql_free_result($result2);**
}
}
Grâce.
J'espère sincèrement que le code que vous citez est à des fins d'illustration seulement - ce qui peut être fait en une seule requête SQL: INSERT INTO another_table (produit_id, produit_nom) SELECT produit_id, produit_nom, à PARTIR de produits
OriginalL'auteur user187580 | 2010-03-23
Vous devez vous connecter pour publier un commentaire.
Citant la documentation de
mysql_free_result
:Donc, si la documentation dit que c'est généralement pas nécessaire d'appeler cette fonction, je dirais qu'il n'est pas vraiment nécessaire, ni des bonnes pratiques, pour l'appeler 😉
Et, juste pour dire : je n'ai presque jamais appeler cette fonction à moi-même ; la mémoire est libérée à la fin du script, et chaque script doit pas manger trop de mémoire.
Une exception pourrait être longue lots qui ont à traiter de grandes quantités de données, mais...
OriginalL'auteur Pascal MARTIN
Oui, il est de bonne pratique d'utiliser
mysql_free_result($result)
. La cité de la documentation dans l'acceptation réponse est inexacte. C'est ce que dit la documentation, mais qui n'a pas de sens. Voici ce qu'il dit:La première partie de la première phrase est correcte. Il est vrai que vous n'avez pas besoin de l'utiliser pour des raisons autres que des problèmes de mémoire. Problèmes de mémoire sont la seule raison de l'utiliser. Cependant, la deuxième partie de la première phrase n'a aucun sens. La demande est que vous ne serait inquiète de la mémoire pour les requêtes qui retournent des grands ensembles de résultats. C'est très trompeur car il existe d'autres scénarios courants où la mémoire est un sujet de préoccupation et de l'appel de
mysql_free_result()
est un très bon entraînement. De tout temps, les requêtes peuvent être exécutées en un nombre indéterminé de fois, de plus en plus de mémoire sera utilisé si vous n'appelez pasmysql_free_result()
. Donc, si vous exécutez votre requête dans une boucle, ou à partir d'une fonction ou d'une méthode, il est généralement une bonne idée d'appelermysql_free_result()
. Vous avez juste à être prudent de ne pas libérer le résultat jusqu'à ce que après il ne sera plus utilisé. Vous pouvez vous protéger d'avoir à y penser quand et comment l'utiliser en faisant votre propre select() et ex() fonctions de sorte que vous ne sont pas de travailler directement avec les ensembles de résultats. (Rien dans le code ici est exactement la façon dont je voudrais en fait de l'écrire, c'est plus illustratif. Vous voudrez peut-être mettre ces en classe ou dans un espace de noms particulier, et de jeter un autre type d'Exception, ou de prendre d'autres paramètres comme la$class_name
, etc.)Maintenant, si vous n'appelez
select()
etex()
, vous êtes juste faire face à la normale des variables d'objet et de normal que les problèmes de mémoire au lieu de manuel de gestion de la mémoire. Vous avez encore de penser à propos de la mémoire des préoccupations, comme la quantité de mémoire utilisée par le tableau d'objets. Après la variable est hors de portée, ou vous définissez manuellement il est null, il devient disponible pour la collecte des ordures alors, PHP prend soin de cela pour vous. Vous pouvez encore envie de le mettre à null avant qu'il passe hors de la portée si votre code n'utilisez pas plus et il y a des opérations suivantes que l'utilisation d'une quantité inconnue de mémoire tels que les boucles et autres appels de fonction. Je ne sais pas comment les ensembles de résultats et les fonctions d'exploitation sont mis en œuvre sous le capot (et même si je l'ai fait, cela pourrait changer avec différents/les futures versions de PHP et MySQL), il existe la possibilité que leselect()
fonction est environ le double de la quantité de mémoire utilisée juste avantmysql_free_result($rs)
est appelé. Cependant, l'utilisation de select() encore élimine ce qui nous généralement la principale préoccupation de plus en plus de mémoire utilisée pendant des boucles et des différents appels de fonction. Si vous êtes préoccupé par ce potentiel pour une double utilisation de la mémoire, et vous ne travaillez qu'avec une seule ligne à la fois sur une seule itération, vous pouvez faire un de chaque() fonction qui ne sera pas le double de votre utilisation de la mémoire, et sera toujours vous protéger de la réflexion surmysql_free_result()
:Vous pouvez l'utiliser comme ceci:
Un autre avantage de l'utilisation de chacun() est qu'elle ne retourne rien, de sorte que vous n'avez pas à réfléchir pour savoir si ou de ne pas définir la valeur de retour la valeur null à plus tard.
OriginalL'auteur still_dreaming_1
Cela dépend de la taille de vos requêtes, ni le nombre de requêtes que vous exécutez.
PHP permet de libérer la mémoire à la fin du script(s) automatiquement, mais pas pendant la course. Donc, si vous avez une grande quantité de données venant d'une requête, meilleur gratuit, le résultat manuellement.
Je dirais: OUI, c'est bien pratique parce que vous vous souciez de la mémoire lors de l'élaboration ou de vos scripts et c'est ce qui fait un bon développeur 🙂
OriginalL'auteur Robert
La réponse est bien sûr OUI en mysqli.
Jetez un oeil à PHP mysqli_free_result documentation:
J'ai utilisé pour le tester avec la fonction memory_get_usage fonction:
Et c'est le résultat:
Et ici, nous parlons de
151,344 bytes
de mémoire que dans1000
les lignes de la table mysql.Comment environ un million de lignes et comment est-il penser à de grands projets?
mysqli_free_result()
n'est pas seulement pour les grandes quantité de données, il est également une bonne pratique pour les petits projets.OriginalL'auteur Mahyar Khanbabai