Mysqli_result::free增加PHP内存使用


mysqli_result::free increase php memory usage

有时memory_get_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

但是如果我在循环中注释指令,那么在free():

之后内存使用减少
$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: 593,120
After: 325,448

结果是相当大的(~Mb)和有很多的文本。只有几百行。

如果结果少于~10行,内存使用总是减少。

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

谁能解释一下这是怎么回事?

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

http://dev.mysql.com/doc/apis-php/en/apis-php-mysqlnd.stats.html

注意mysqlnd(不像MySQL客户端库)尊重PHP内存限制,因为它使用PHP内部内存管理函数分配内存。这也是memory_get_usage报告使用mysqlld而不是MySQL客户端库。Memory_get_usage不测量内存MySQL客户端库的所有消费,因为MySQL客户端库不使用PHP内部内存管理函数由功能监控!

我最好的猜测是:虽然缓冲的结果集仍然存在于MySQL库中,你的$myArray有一个对相同内存的引用,因此内存不被认为是使用的。然而,一旦您释放结果集,内存就变成"拥有"或以其他方式转移到您的数组,并且现在计算内存使用情况。

这可能不完全正确或不完整,但我相当有信心,这是问题的总体要点。