为什么我们要关闭 $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() 基本上释放了附加到结果的所有内容。您需要了解有两种(简化的,但随它去)检索行的方法:
缓冲 - 一切都被一口气抢走。换句话说,当您开始循环记录时,它们实际上已经在内存中了。他们是buffered。每次调用 fetch() 时,它们并不是从服务器中提取,而是从内存中提取。
非缓冲 - 可能有一个小缓冲区,但基本上每次调用 fetch() 时,PHP 都必须从数据库中提取新行。在循环开始时,它们并不都位于内存中。
有趣的是:可以非常有效地在缓冲查询上调用 num_rows(),因为所有行都已被拉出(尽管您不应该仅仅为了对它们进行计数而拉出所有行 - 这就是 COUNT 的用途)。非缓冲查询在提取所有行之前无法执行 num_rows() 操作。这意味着它要么是一个错误,要么本质上将其变成一个缓冲查询。
无论如何,回到你的实际问题:
free() 释放与结果对象关联的任何内容。对于缓冲查询,这是内存中的任何行。在非缓冲查询的情况下, free() 将释放内存中可能存在的任何行,然后取消其余的请求。基本上它是 PHP 告诉 MySQL,“嘿,你知道我请求的所有行吗?我改变了主意。你可以放弃那个请求。”
至于是否应该释放结果......好吧,每当变量超出范围*时,它无论如何都会发生。但是,显式执行此操作并没有什么坏处,并且在查询可能使用大量内存,然后另一个查询可能使用大量内存的情况下,您可能希望释放这些集合以保持较低的内存使用量。
* 或者也许当请求结束时。我一时记不起。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)