我有一些关于使用MySQLi,查询和相关内存管理的问题.这里的代码只是为了澄清我的问题,所以不要在它上面进行错误检查等等.我知道需要做的事:)
假设我有这样的事情:
@ $db = new mysqli($dbhost, $un, $ps, $dbname);
$query = "SELECT field1, field2 ".
"FROM table1 ".
"WHERE field1={$some_value}";
$results = $db->query($query);
while ($result = $results->fetch_object()) {
// Do something with the results
}
$query = "SELECT field1, field2 ".
"FROM table2 ".
"WHERE field1={$some_value2}";
// question 1
$results = $db->query($query);
while ($result = $results->fetch_object()) {
// Do something with the second set of results
}
// Tidy up, question 2
if ($results) {
$results->free();
}
if ($db) {
$db->close();
}
// Question 3, a general one
Run Code Online (Sandbox Code Playgroud)
所以,基于上面代码中的注释,这是我的问题:
当我分配第二个查询的结果$results时,与先前结果相关的内存会发生什么?我应该在分配新结果之前释放该结果吗?
与1相关,当我最后清理时,是否只清理了最后的结果?
当我尝试清理结果时,我应该如上所述释放它,我应该关闭它,还是两者兼而有之?
我问问题3,因为PHP文档中mysqli::query有一个使用close的示例,即使close不是其中的一部分mysqli_result(参见mysqli :: query中的示例1 ).相比之下,我的普通PHP参考文本使用free(PHP和MySQL Web开发,第四版,Welling和Thomson).
Pas*_*TIN 54
当我分配第二个查询的结果
$results时,与先前结果相关的内存会发生什么?
当你执行这个:
$results = $db->query($query);
Run Code Online (Sandbox Code Playgroud)
如果$results之前有某些内容,则无法再访问此旧内容,因为没有任何引用.
在这种情况下,PHP会将变量的旧内容标记为" 不再需要 " - 当PHP需要一些内存时,它将从内存中删除.
对于一般的PHP变量,这至少是正确的; 但是,在SQL查询结果的情况下,某些数据可能会保留在驱动程序级别的内存中 - 而PHP没有太多控制权.
我应该在分配新结果之前释放该结果吗?
我从来没有这样做 - 但是,引用手册页mysqli_result::free:
注意:当不再需要结果对象时,应始终使用mysqli_free_result()释放结果
对于一个小脚本来说可能并不重要......唯一可以确定的方法是memory_get_usage在调用该方法之前和之后使用它来测试是否存在差异.
与1相关,当我最后清理时,是否只清理了最后的结果?
当脚本结束时:
因此,在脚本结束时,可能根本不需要释放结果集.
当我尝试清理结果时,我应该如上所述释放它,我应该关闭它,还是两者兼而有之?
如果关闭与数据库的连接(使用mysqli::close您建议的那样),这将使您与数据库断开连接.
这意味着如果您想进行其他查询,则必须重新连接!哪个不好(需要一些时间,资源......)
一般来说,我不会关闭与数据库的连接,直到我确定我不再需要它 - 这意味着我不会在脚本结束之前断开连接.
而" 脚本的结尾 "意味着" 连接将被关闭 ",即使您没有指定它; 我几乎从不关闭连接.
mr.*_*. w 15
已经提供的答案很好,但我想补充一点并澄清另一点.
一,澄清.关于close()方法的使用,重要的是要注意OP是引用mysqli_result类的close()方法,而不是mysqli类.在结果类中,close()方法只是free()方法的别名,如文档中所示,而在mysqli类中,它关闭连接.因此,如果需要,可以在结果上使用close()代替free().
第二,附加点.正如已经指出的那样,PHP的执行模式意味着最终将清除所有内容,因此,您不一定需要担心释放内存.但是,如果您正在分配大量结果对象,或者您正在分配特别大的结果对象(例如,获取大量数据),那么您应该在完成后释放内存以进一步防止出现问题沿着执行的道路走下去.当您的应用程序开始获得更多流量时,这变得尤为重要,因为跨会话的内存总量很快就会变得非常重要.
| 归档时间: |
|
| 查看次数: |
34179 次 |
| 最近记录: |