使用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内存的使用?
有人可以解释这里发生了什么吗?
答案 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具有对相同内存的引用,因此不考虑使用内存。但是,一旦你释放了结果集,内存就变成了拥有的"或以其他方式转移到您的阵列,现在计算内存使用量。
这可能不完全正确或完整的故事,但我相信这是这个问题的一般要点。