mysqli_result::free 增加 php 内存使用

mysqli_result::free increase php memory usage

有时 memory_get_usage() return 使用 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

Note that mysqlnd (unlike the MySQL Client Library) respects the PHP memory limit because it uses PHP internal memory management functions to allocate memory. This is also the reason why memory_get_usage reports a higher memory consumption when using mysqlnd instead of the MySQL Client Library. memory_get_usage does not measure the memory consumption of the MySQL Client Library at all because the MySQL Client Library does not use PHP internal memory management functions monitored by the function!

我最好的猜测是:虽然缓冲的结果集仍然存在于 MySQL 库中,但您的 $myArray 引用了相同的内存,因此内存未被视为已使用。但是,一旦您释放了结果集,内存就会变成 "owned" 或以其他方式转移到您的数组,现在计算内存使用量。

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