关于在php脚本中释放内存的问题

时间:2009-08-02 23:25:09

标签: php mysql performance memory

我刚刚在剧本中看到了这个

mysql_free_result($rawdb);

我在一个脚本的某个地方看到它,它运行了一个mysql查询并将结果保存到一个数组中,在添加到数组后,它运行了我认为是免费的mysql查询使用的内存。

我只是要求验证,这样做是个好主意吗?我有几个mysql查询返回一个保存到数组的大结果,我应该在它之后运行该代码吗?

同样在性能意识的环境中,最好在完成它们时取消设置大会话和变量吗?

6 个答案:

答案 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手册页回答了大部分问题:

http://us.php.net/manual/en/function.mysql-free-result.php