memory_get_usage

时间:2010-03-09 13:57:29

标签: php memory memory-management

我正在制作一个基准测试类来显示页面加载时间和内存使用情况。 加载时间已经有效,但是当我显示内存使用情况时,它不会改变 例如:

$conns = array();
ob_start();
benchmark::start();
$conns[] = mysql_connect('localhost', 'root', '');
benchmark::stop();
ob_flush();

使用与

相同的内存
$conns = array();
ob_start();
benchmark::start();
for($i = 0; $i < 1000; $i++)
{
   $conns[] = mysql_connect('localhost', 'root', '');
}
benchmark::stop();
ob_flush();

我正在使用memory_get_usage(true)来获取以字节为单位的内存使用量。

4 个答案:

答案 0 :(得分:8)

memory_get_usage(true)将显示php引擎分配的内存量,而不是脚本实际使用的内存量。您的测试脚本很可能不需要引擎要求更多内存。

对于测试,抓取一个大(ish)文件并将其读入内存。你应该看到一个改变。

我已成功使用memory_get_usage(true)来跟踪网页抓取脚本的内存使用情况,并且工作正常(因为目标是在达到系统内存限制之前减慢速度)。要记住的一件事是它不会根据实际使用情况而改变,它会根据引擎请求的内存而改变。 所以你最终看到的是突然跳跃而不是减缓增长(或缩小)。

如果将real_usage标志设置为false,则可能会看到非常小的内存更改 - 但是,这无法帮助您监控内存的真实内存量。从系统请求。

更新:要明确我所描述的差异是脚本变量使用的内存与引擎请求运行的内存之间的差异你的脚本。所有相同的脚本,不同的测量方法。)

答案 1 :(得分:2)

我不是PHP内部的大师,但我可以想象echo不会影响PHP使用的内存量,因为它只是向客户端输出内容。

如果启用输出缓冲,可能会有所不同。

以下内容应该有所不同:

$result = null;
benchmark::start()
for($i = 0; $i < 10000; $i++)
{
   $result.='test';
}

答案 2 :(得分:2)

看看:

for($i = 0; $i < 1000; $i++)
{
   $conns[] = mysql_connect('localhost', 'root', '');
}

你可能已经循环到100,000并且没有任何改变,它是相同的连接。没有为它分配资源,因为记住它们的链表从未增长。它为什么会成长? $conns[0]已经(假设)有效句柄。它在memory_get_usage()中没有区别。你测试了$conns[15]是否有效,是吗?

root @ localhost可以有多个密码吗?不,为什么PHP会因为你告诉它而烦恼处理另一个连接? (舌头在脸颊)。

我建议通过CLI通过Valgrind运行相同的东西来查看实际的堆使用情况:

valgrind /usr/bin/php -f foo.php ..或类似的东西。在底部,您将看到分配的内容,释放的内容以及工作中的垃圾收集。

免责声明:我确实了解PHP内部的方法,但我不是那个用C语言编写的故意混淆迷宫的专家,Zend称之为PHP。

答案 3 :(得分:0)

echo不会更改分配的字节数(除非您使用output buffers)。

在for循环之后取消设置$ i变量,所以它也不会改变分配的字节数。

尝试使用输出缓冲示例:

ob_start();
benchmark::start();
for($i = 0; $i < 10000; $i++)
{
   echo 'test';
}
benchmark::stop();
ob_flush();