mysqli 关闭 php,PHP-为什么我们在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,“嘿,您知道我请求的所有行?改变了主意.您可以删除该请求.”

至于您是否应该释放结果…那么,只要变量超出范围*,它将始终发生.但是,明确地执行此操作没有任何危害,并且在查询可能使用大量内存,然后又在查询之后使用大量内存的情况下,您可能希望释放这些集只是为了保持较低的内存使用率.

*或当请求结束时.我不记得我的头顶了.

标签:mysqli,mysql,php

来源: https://codeday.me/bug/20191101/1984814.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值