mysqli_结果::免费增加php内存使用

mysqli_结果::免费增加php内存使用,php,mysql,memory,mysqli,Php,Mysql,Memory,Mysqli,有时memory\u get\u usage()在使用free()后返回更大的值。请参见下面的示例: $query = "SELECT * FROM table"; $result = self::query($query); while ($row = $result->fetch_assoc()) { $myArray[] = $row; } echo "Before: ".number_format(memory_get_usage()); $result->fre

有时
memory\u get\u usage()
在使用
free()
后返回更大的值。请参见下面的示例:

$query = "SELECT * FROM table";
$result = self::query($query);

while ($row = $result->fetch_assoc())
{
    $myArray[] = $row;
}

echo "Before: ".number_format(memory_get_usage());
$result->free();
echo "After: ".number_format(memory_get_usage());
输出为:

Before: 1,203,856
After: 1,370,976
但是如果我在循环中对指令进行注释,那么在
空闲()之后,内存使用会减少:

给出:

Before: 593,120
After: 325,448
结果是相当大的
(~Mb)
,并且有很多文本。它只有几百行

如果结果少于10行,则内存使用始终会减少

我的猜测是free()释放了MySQL的内存,而不是php,但为什么它通常会减少php的内存使用


有人能解释一下这里发生了什么吗?

如果您使用的是mysql,而不是mysqli,请注意这里:

请注意,mysqlnd(与MySQL客户端库不同)尊重PHP 内存限制,因为它使用PHP内部内存管理函数 分配内存。这也是内存得到充分利用的原因 当使用mysqlnd而不是 MySQL客户端库。内存使用率并不衡量内存 MySQL客户端库的消耗,因为MySQL 客户端库不使用PHP内部内存管理函数 由功能监控

我最好的猜测是:虽然缓冲结果集仍然存在于MySQL库中,但是$myArray引用了相同的内存,因此认为没有使用内存。但是,一旦释放结果集,内存将变为“所有”或以其他方式传输到阵列中,此时将统计内存使用情况


这可能不完全正确,也不完整,但我相信这是问题的基本要点。

事实上,我正在使用Mysqlnd,您似乎接近事实。但问题是:“应该总是使用free(),因为它有时会增加内存使用量吗?”它可能不是真的增加内存使用量,可能只是你看不到而已。
Before: 593,120
After: 325,448