2

我习惯于将变量使用量保持在最低限度。所以我想知道以下是否有任何优势:

$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通过重新分配变量来释放我做同样的事情吗?我不知道如何记录这种事情 - 有人有什么想法吗?

4

2 回答 2

5

手册似乎建议您仍然应该使用free()来释放内存。我相信原因是在MySQLfree()中释放内存,而不是在 PHP 中。由于 PHP 不能为 MySQL 进行垃圾收集,因此您需要调用.free()

于 2008-08-25T18:08:38.373 回答
3

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

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

但是,由于 PHP 页面的寿命通常很短,结果集很小,因此节省的内存是微不足道的。除非您在长时间运行的页面上长时间将大量结果留在内存中,否则您不会注意到速度变慢。

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

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

于 2008-08-28T09:29:55.973 回答