我刚刚在剧本中看到了这个
mysql_free_result($rawdb);
我在一个脚本的某个地方看到它,它运行了一个mysql查询并将结果保存到一个数组中,在添加到数组后,它运行了我认为是免费的mysql查询使用的内存。
我只是要求验证,这样做是个好主意吗?我有几个mysql查询返回一个保存到数组的大结果,我应该在它之后运行该代码吗?
同样在性能意识的环境中,最好在完成它们时取消设置大会话和变量吗?
答案 0 :(得分:2)
我不担心。所有结果资源都在脚本结束时释放,除非在使用大结果集进行查询时遇到内存问题,否则差异可以忽略不计。
那就是说,如果我正在阅读你的代码并看到mysql_free_result
我肯定知道你不会在代码中的任何地方使用该资源,所以它可以增加一些可读性...
答案 1 :(得分:2)
我认为把它放入你的数据抽象层是一种很好的做法,因为它使它成为一个有内存处理的好公民。特别是因为很多PHP代码都没有。 : - /
PHP 4中的内存使用问题比5中差得多,但它仍然是一个问题。如果你必须不断提高你的PHP脚本允许的最大内存(默认值是8Mb,但我使用的大多数环境都是64Mb),那么你可能应该考虑你的脚本如何使用和过度使用内存。使用mysql_free_result()
是这个武器库中的一个部分,但它本身就是毫无意义的。如果您使用mysql_unbuffered_query()
并使用mysql_fetch()
检索每一行时处理每一行,则可以有效地处理大量数据集。我已经看到,在重写这些方法时,脚本处理数据的能力会大大增加。
答案 2 :(得分:1)
对此in the PHP API documentation进行了一些讨论。根据您的使用情况(即您要检索的结果的大小),mysql_free_result()
可能会改善或降低性能。正如该链接底部的评论者所说,请致电memory_get_usage()
以了解您是否应该释放结果。实际上没有什么可以检查你的资源使用情况。
答案 3 :(得分:1)
同样在表现意识中 环境是好的做法 取消设置大型会话和变量 什么时候完成它们?
请注意,如果您从$_SESSION
取消设置变量,则会有效地将其从会话中删除:下次用户调用您网站的页面时,它们将不会存在。
因此,您可能需要小心这个想法:只有在您不再需要时才从$_SESSION
删除数据。
关于unset
数据和/或使用mysql_free_result
等函数:考虑到你的脚本是(我想,因为PHP用于网络开发,用户不会等待数小时要加载的页面只运行几百毫秒,以这种方式释放内存可能有点矫枉过正:只要你没有得到memory_limit
相关的错误,你可能就不应该关心了。
答案 4 :(得分:0)
来自manual:
mysql_free_result()
只需要 如果您担心如何,请致电 大量内存用于查询 返回大的结果集。所有 相关结果记忆是 在结束时自动释放 脚本的执行。
答案 5 :(得分:0)
该函数的PHP手册页回答了大部分问题: