使用MySQLi - 这更适合关闭查询

时间:2008-08-25 17:59:29

标签: php mysql memory mysqli

我养成了将变量使用率保持在最低限度的习惯。所以我想知道以下是否有任何好处:

$query = $mysqli->query('SELECT * FROM `people` ORDER BY `name` ASC LIMIT 0,30');

// Example 1
$query = $query->fetch_assoc();

// Example 2
$query_r = $query->fetch_assoc();
$query->free();

现在,如果我是对的,当我重新分配它时,示例1应该更有效,因为$queryunset,它应该释放任何与之关联的内存。但是有一种方法(MySQLi_Result::free())可以释放相关的内存 - 这是一回事吗?

如果我不调用::free()来释放与结果相关的任何内存,而unset通过重新分配变量,我会做同样的事情吗?我不知道如何记录这类事情 - 有没有人有一些想法?

2 个答案:

答案 0 :(得分:5)

manual似乎暗示您仍应使用free()释放内存。我相信推理是free()释放了 MySQL 中的内存,而不是PHP。由于PHP无法对MySQL进行垃圾收集,因此您需要调用free()

答案 1 :(得分:3)

示例1 从MySQL结果中分离 $ query变量。 MySQL结果仍然存在于内存中,并将继续存在并浪费内存直到垃圾收集发生。

示例2 立即释放 MySQL结果,释放使用过的资源。

但是,由于PHP页面通常具有较短的结果集,因此节省的内存非常简单。除非您长时间在长时间运行的页面上将一吨的结果留在内存中,否则您不会注意到减速。

布莱恩 PHP 可以垃圾收集MySQL结果,它不会立即发生。 结果存在于PHP的内存池中,而不是MySQL服务器中。

(使用无缓冲查询时的内存位置略有不同,但在PHP中很少使用它们而不值得一提)