如何确定变量的内存占用量(大小)?其他探查器选项php-memory-profiler使用谷歌gperftools(推荐!Xhprof + Xhgui(在我看来,最好的分析CPU和内存)黑火Xdebug 和跟踪内存使用情况福普断续器

2022-08-30 07:21:50

PHP中是否有函数(或PHP扩展)来找出给定变量使用多少内存? 只是告诉我元素/属性的数量。sizeof

memory_get_usage它为我提供了整个脚本使用的内存大小。有没有办法为单个变量执行此操作?

请注意,这是在开发计算机上,因此加载扩展或调试工具是可行的。


答案 1

没有直接的方法可以获得单个变量的内存使用情况,但正如Gordon所建议的那样,您可以使用.这将返回分配的内存总量,因此您可以使用解决方法并测量之前和之后的使用情况,以获取单个变量的使用情况。这有点黑客,但它应该有效。memory_get_usage

$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;

请注意,这绝不是一种可靠的方法,在分配变量时,您无法确定没有其他任何东西会触及内存,因此这应该仅用作近似值。

实际上,您可以通过在函数内创建变量的副本并测量使用的内存来将其转换为函数。没有测试过这个,但原则上,我没有看到任何错误:

function sizeofvar($var) {
    $start_memory = memory_get_usage();
    $tmp = unserialize(serialize($var));
    return memory_get_usage() - $start_memory;
}

答案 2

您可能需要一个内存探查器。我已经收集了SO的信息,但我已经复制了一些重要的事情,也可能对你有所帮助。

您可能知道,Xdebug 自 2.* 版本以来就放弃了对内存分析的支持。请在此处搜索“已删除的函数”字符串:http://www.xdebug.org/updates.php

已删除的函数

删除了对内存分析的支持,因为内存分析无法正常工作。

其他探查器选项

php-memory-profiler

https://github.com/arnaud-lb/php-memory-profiler。这是我在Ubuntu服务器上启用它所做的:

sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof
echo "extension=memprof.so" > /etc/php5/mods-available/memprof.ini
sudo php5enmod memprof
service apache2 restart

然后在我的代码中:

<?php
memprof_enable();
// do your stuff
memprof_dump_callgrind(fopen("/tmp/callgrind.out", "w"));

最后用KCachegrind打开文件callgrind.out

使用谷歌gperftools(推荐!

首先,通过在此处下载最新的软件包来安装Google gperftoolshttps://code.google.com/p/gperftools/

然后一如既往:

sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install

现在在您的代码中:

memprof_enable();

// do your magic

memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));

然后打开您的终端并启动:

pprof --web /tmp/profile.heap

pprof将在您现有的浏览器会话中创建一个新窗口,如下所示:

PHP memory profiling with memprof and gperftools

Xhprof + Xhgui(在我看来,最好的分析CPU和内存)

使用XhprofXhgui,您也可以分析CPU使用情况,或者如果这是您目前的问题,则仅分析内存使用情况。这是一个非常完整的解决方案,它为您提供了完全控制,日志可以写入mongo或文件系统中。

有关更多详细信息,请参阅此处

黑火

Blackfire是SensioLabs的PHP分析器,Symfony2的家伙 https://blackfire.io/

如果您使用 puphpet 来设置虚拟机,您会很高兴知道它受支持;-)

Xdebug 和跟踪内存使用情况

XDEBUG2 是 PHP 的扩展。Xdebug允许您记录所有函数调用,包括参数,并以不同的格式将值返回到文件中。有三种输出格式。一个是人类可读的跟踪,另一个更适合计算机程序,因为它更容易解析,最后一个使用HTML来格式化跟踪。您可以使用该设置在两种不同的格式之间切换。此处提供了一个示例

福普

forp 简单、非侵入式、面向生产的 PHP 分析器。一些功能是:

  • 测量时间和为每个功能分配的内存

  • 处理器使用率

  • 函数调用的文件和行号

  • 输出为谷歌的跟踪事件格式

  • 函数标题

  • 函数分组

  • 函数的别名(对匿名函数有用)

断续器

DBG是一个功能齐全的php调试器,一个交互式工具,可以帮助您调试php脚本。它适用于生产和/或开发 WEB 服务器,并允许您在本地或远程从 IDE 或控制台调试脚本,其功能包括:

  • 远程和本地调试

  • 显式和隐式激活

  • 调用堆栈,包括函数调用、动态和静态方法调用及其参数

  • 在调用堆栈中导航,能够评估相应(嵌套)位置中的变量

  • 单步执行/单步执行/单步执行/运行到光标功能

  • 条件断点

  • 全局断点

  • 记录错误和警告

  • 用于并行调试的多个同时会话

  • 支持 GUI 和 CLI 前端

  • 支持 IPv6 和 IPv4 网络

  • 调试器传输的所有数据都可以选择使用SSL进行保护


推荐