PHP(或PHP扩展)中是否有一个函数可以找出给定变量使用了多少内存?sizeof
只是告诉我元素/属性的数量.
memory_get_usage
有助于它给我整个脚本使用的内存大小.有没有办法为单个变量执行此操作?
请注意,这是在开发机器上,因此加载扩展或调试工具是可行的.
没有直接的方法来获取单个变量的内存使用情况,但正如Gordon建议的那样,你可以使用memory_get_usage
.这将返回分配的内存总量,因此您可以使用变通方法并测量前后使用情况以获取单个变量的使用情况.这有点hacky,但它应该工作.
$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; }
您可能需要Memory Profiler.我收集了信息,但是我复制了一些可能对你有帮助的重要事情.
您可能知道,自从2.*版本以来,Xdebug删除了内存分析支持.请在此处搜索"已删除的函数"字符串:http://www.xdebug.org/updates.php
其他Profiler选项 PHP-存储器廓删除了功能
删除了对内存分析的支持,因为它无法正常工作.
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
然后在我的代码中:
最后
使用谷歌gperftools(推荐!)callgrind.out
用KCachegrind打开文件首先在此处下载最新的软件包来安装Google gperftools:https://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.heappprof将在您现有的浏览器会话中创建一个新窗口,如下所示:
Xhprof + Xhgui(在我看来,最好的配置cpu和内存)使用Xhprof和Xhgui,您可以分析cpu的使用情况,或者只是内存使用情况,如果这是您目前的问题.这是一个非常完整的解决方案,它可以让您完全控制,并且可以在mongo或文件系统中编写日志.
欲了解更多详细信息,请参见这里.
黑火Blackfire是SensioLabs的PHP探查器,Symfony2人员https://blackfire.io/
如果您使用puphpet设置您的虚拟机,您会很高兴知道它的支持;-)
Xdebug和跟踪内存使用情况XDEBUG2是PHP的扩展.Xdebug允许您记录所有函数调用,包括参数和返回值到不同格式的文件.有三种输出格式.一个是人类可读的跟踪,另一个更适合计算机程序,因为它更容易解析,最后一个使用HTML格式化跟踪.您可以使用该设置在两种不同格式之间切换.这里有一个例子
forpforp简单,非侵入式,面向生产,PHP分析器.一些功能是:
测量每个功能的时间和分配的内存
CPU使用率
函数调用的文件和行号
输出为Google的跟踪事件格式
功能标题
功能分组
函数别名(对匿名函数有用)
DBG
DBG是一个功能齐全的php调试器,一个可以帮助您调试PHP脚本的交互式工具.它适用于生产和/或开发WEB服务器,允许您从IDE或控制台本地或远程调试脚本,其功能包括:
远程和本地调试
显式和隐式激活
调用堆栈,包括函数调用,动态和静态方法调用及其参数
通过调用堆栈导航,能够评估相应(嵌套)位置中的变量
步入/退出/跳过/运行到光标功能
条件断点
全球断点
记录错误和警告
并行调试的多个同时会话
支持GUI和CLI前端
支持IPv6和IPv4网络
调试器传输的所有数据都可以选择使用SSL进行保护
这正是*我正在寻找的信息,谢谢.
3> Aistina..:不,那里没有.但你可以
serialize($var)
检查strlen
结果的近似值.
这是一个可怕的近似.PHP中数组中的每个项目都是~80个字节,但是`strlen(serialize(array(1,2,3)))`是30.
至少相对大小的良好启发式.
@Aistina,-1.你在测量错误的东西.变量和序列化变量是两个*完全*不同的东西,并将给出完全不同的结果.
4> para..:回答Tatu Ulmanens的回答:
应该注意,它
$start_memory
本身将占用内存(PHP_INT_SIZE * 8
).所以整个功能应该变成:
function sizeofvar($var) { $start_memory = memory_get_usage(); $var = unserialize(serialize($var)); return memory_get_usage() - $start_memory - PHP_INT_SIZE * 8; }很抱歉将此作为额外答案添加,但我还不能评论答案.
更新:*8不是确定的.它显然可能依赖于php版本,可能还有64/32位.
你能解释为什么`*8`?谢谢!