【问题标题】:PHP memory_get_usage() on empty PHP script空 PHP 脚本上的 PHP memory_get_usage()
【发布时间】:2013-01-10 14:46:46
【问题描述】:

我决定查看为我的几个 PHP 脚本分配了多少内存,发现它的峰值约为 130KiB。不错,我想,考虑到脚本中发生的事情。

然后,我决定看看脚本是从什么开始的。我预计大约 32KiB。

我得到了 121952 个字节。之后,我尝试测试一个完全没有的脚本:

<?php 
echo memory_get_usage();

它也开始分配相同数量的内存。

现在,很明显,PHP 会在脚本运行之前为其分配一些内存,但这似乎有点过分了。

但是,根据当时系统可用的内存量,它似乎根本不是动态的。我尝试通过打开其他进程来消耗更多系统内存,但预分配的内存量保持相同的确切字节数。

这是否可以在每个脚本的基础上进行配置,PHP 如何确定它将分配给每个脚本的多少?

使用 PHP 版本 5.4.7

谢谢。

【问题讨论】:

    标签: php memory-management


    【解决方案1】:

    memory_get_usage 函数直接查询 PHP 的内存分配器以获取此信息。它报告 PHP 本身使用了多少内存,而不是整个进程甚至整个系统使用了多少。

    如果你不传递额外的true 参数,你得到的是你的代码使用的确切内存量;这永远不会超过memory_get_usage(true) 报告的内容。

    如果您调用memory_get_usage(true),您将获得分配器从系统中保留的堆大小,其中包括您的代码未实际使用但您的代码可以直接使用的内存。

    当您的脚本需要比分配器可用的内存更多的内存时,后者将从操作系统中保留另一个大块,您会看到memory_get_usage(true) 急剧上升,而memory_get_usage() 可能只会增加几个字节。

    分配器用来决定何时分配多少内存以及分配多少内存的确切策略在编译时被嵌入到 PHP 中;您必须编辑源代码并编译 PHP 才能更改此行为。

    【讨论】:

    • 我传递了 true 参数,它现在返回 262144 字节,使用上面的空代码示例。
    • @crush:这不是问题,所以我不知道如何回答。
    • 您提到如果我将 true 传递给函数,它将报告我的代码正在使用的确切内存量。所以,请解释一下为什么一个完全空的脚本,只调用memory_get_usage(true); 报告的回报是简单memory_get_usage(); 的脚本的两倍多,根据你的说法,这是分配给PHP 分配器的总量,报告。跨度>
    • @crush:哎呀,我的错。实际上是相反的(相应地编辑了答案)。
    • 好吧,这更有意义!谢谢。现在,这引出了我的下一个问题:我可以指定分配多少,为什么要为单个函数调用分配这么大的内存块?
    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2013-08-08
    • 2010-10-28
    • 2012-09-20
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多