![](/img/trans.png)
[英]mysqli - Do I really need to do $result->close(); & $mysqli->close();?
[英]Why do we close result in Mysqli
我们为什么要关闭$ result
$mysqli = new mysqli("localhost", "root", "root", "test");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}
if ($result = $mysqli->query("Select * from user")) {
while ($row = $result->fetch_object())
{
//var_dump($row);
}
$result->close();
}
检查连接是否失败,检查使用连接的代码。 显然这不起作用,因为它不是一个实时连接。 确保如果连接失败,则不会访问依赖于它的代码。 (请注意,我没有必要提倡使用exit或die。它们可能会带来相当糟糕的用户体验。它们可能很有用,但理想情况下,您应该输出更好的消息并留下日志中的丑陋错误内容[除非你'只测试或它是一个命令行脚本])。
至于close()(实际上是free()的别名):
free()基本上释放所有附加到结果的东西。 您需要了解有两种方法(简化,但请使用它)检索行的方法:
缓冲 - 一切都被抢走了。 换句话说,当你开始循环记录时,它们实际上已经在内存中了。 他们是缓冲的 。 每次调用fetch()时都不会从服务器中取出它们,而是从内存中取出它们。
非缓冲 - 可能有一个小缓冲区,但基本上每次调用fetch()时,PHP都必须从数据库中提取一个新行。 在循环开始时,它们并非都在内存中。
有趣的说明:num_rows()可以非常有效地在缓冲查询上调用,因为所有的行都已被拉动(尽管你永远不应该拉所有的行来计算它们 - 这就是COUNT的用途)。 非缓冲查询在拉出所有行之前不能执行num_rows()。 这意味着它将是一个错误,或者实质上将它变成一个缓冲的查询。
无论如何,回到你的实际问题:
free()释放与结果对象关联的任何内容。 在缓冲查询的情况下,这是位于内存中的任何行。 在非缓冲查询的情况下,free()将释放可能位于内存中的任何行,然后取消其余的请求。 基本上它的PHP告诉MySQL,“嘿,你知道我要求的所有行吗?改变了我的想法。你可以放弃那个请求。”
至于你是否应该释放结果......好吧,每当变量超出范围*时,无论如何都会发生。 但是,明确地执行它并没有什么害处,并且在查询可能使用大量内存然后在其可能使用大量内存之后的另一个查询的情况下,您可能希望释放这些集合以仅保持内存使用率低。
*或者可能在请求结束时。 我不记得我的头顶了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.