为什么我们关闭Mysqli的结果

时间:2012-03-09 06:38:58

标签: php mysql 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();
    }   

1 个答案:

答案 0 :(得分:4)

检查连接是否失败,直至使用连接的代码。显然这不起作用,因为它不是一个实时连接。确保如果连接失败,则不会访问依赖于它的代码。 (请注意,我没有必要提倡使用exit或die。它们可能会带来相当糟糕的用户体验。它们可能很有用,但理想情况下,您应该输出更好的消息并留下日志中的丑陋错误内容[除非你'只测试或它是命令行脚本])。

至于close()(实际上是free()的别名):

free()基本上释放所有附加到结果的东西。您需要了解有两种(简化,但一起使用)检索行的方法:

缓冲 - 一切都被抢走了。换句话说,当你开始循环记录时,它们实际上已经在内存中了。它们是缓冲的。每次调用fetch()时都不会从服务器中拉出它们,而是从内存中拉出来。

非缓冲 - 可能有一个小缓冲区,但基本上每次调用fetch()时,PHP都必须从数据库中提取一个新行。在循环开始时,它们并非都在记忆中。

有趣的注意事项:num_rows()可以非常有效地在缓冲查询上调用,因为所有的行都已被拉动(尽管你永远不应该把所有的行都拉到计算它们 - 这就是COUNT的用途)。非缓冲查询在拉出所有行之前不能执行num_rows()。这意味着它将是一个错误,或者基本上将它变成一个缓冲的查询。

无论如何,回到你的实际问题:

free()释放与结果对象关联的任何内容。在缓冲查询的情况下,这是位于内存中的任何行。在非缓冲查询的情况下,free()将释放可能位于内存中的任何行,然后取消其余的请求。基本上它的PHP告诉MySQL,“嘿,你知道我要求的所有行吗?改变了我的想法。你可以放弃那个请求。”

至于你是否应该释放结果......好吧,每当变量超出范围*时,无论如何都会发生。但是,明确地执行它并没有什么害处,并且在查询可能使用大量内存然后在其可能使用大量内存之后的另一个查询的情况下,您可能希望释放这些集合以仅保持内存使用率低

*或者可能在请求结束时。我不记得我的头脑了。