有时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有一个对相同内存的引用,因此内存不被认为是使用的。然而,一旦您释放结果集,内存就变成"拥有"或以其他方式转移到您的数组,并且现在计算内存使用情况。
这可能不完全正确或不完整,但我相当有信心,这是问题的总体要点。