我有一个习惯,就是将变量的使用保持在最低限度。所以我想知道以下是否有任何好处:

$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 通过重新分配变量我在做同样的事情吗?我不知道如何记录这类事情 - 有人有一些想法吗?

有帮助吗?

解决方案

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

其他提示

实施例1 解离 来自 MySQL 结果的 $query 变量。MySQL结果仍然存在于内存中,并且会继续存在并浪费内存,直到发生垃圾回收。

实施例2 自由 MySQL立即返回结果,释放所使用的资源。

然而,由于 PHP 页面通常寿命较短且结果集较小,因此节省的内存微不足道。除非你离开,否则你不会注意到速度减慢 一吨 长时间运行的页面上长时间内存中的结果。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top