mysqli_result ::免费增加php内存使用量

时间:2015-08-02 00:33:00

标签: php mysql memory mysqli

使用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内存的使用?

有人可以解释这里发生了什么吗?

1 个答案:

答案 0 :(得分:1)

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

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

  

请注意,mysqlnd(与MySQL客户端库不同)尊重PHP   内存限制因为它使用PHP内部内存管理功能   分配内存。这也是memory_get_usage的原因   使用mysqlnd代替时报告更高的内存消耗   MySQL客户端库。 memory_get_usage不测量内存   完全消耗MySQL客户端库因为MySQL   Client Library不使用PHP内部内存管理功能   由功能监控!

我最好的猜测是:虽然缓冲的结果集仍然存在于MySQL库中,但是你的$ myArray具有对相同内存的引用,因此不考虑使用内存。但是,一旦你释放了结果集,内存就变成了拥有的"或以其他方式转移到您的阵列,现在计算内存使用量。

这可能不完全正确或完整的故事,但我相信这是这个问题的一般要点。