有一种方式来获得PHP使用的总内存( memory_get_usage()
但如何在一个单个对象的内存获得大小?
我显然不是在谈论count()
因为我想字节的潜在复杂的数据结构的数量。
有一种方式来获得PHP使用的总内存( memory_get_usage()
但如何在一个单个对象的内存获得大小?
我显然不是在谈论count()
因为我想字节的潜在复杂的数据结构的数量。
您可以调用之前和中所示分配好自己的课后memory_get_usage() 这个来自IBM的例子 。 你甚至可以创建一个包装要做到这一点,可能存储在复杂的类本身的成员变量的结果。
编辑:
为了澄清有关存储分配的内存大小的部分,你可以这样做:
class MyBigClass
{
var $allocatedSize;
var $allMyOtherStuff;
}
function AllocateMyBigClass()
{
$before = memory_get_usage();
$ret = new MyBigClass;
$after = memory_get_usage();
$ret->allocatedSize = ($after - $before);
return $ret;
}
在未来的任何时候,你可以检查allocatedSize,看看有多大这个对象是分配时。 如果您分配之后添加到它,虽然,allocatedSize将不再准确。
难道没有意义的尝试序列化对象和读取字符串的长度? 显然,这将是几个字节了,因为序列化的字符串将有S:“串”因此S:“”是额外的字节...除非连载可能是相同的方式,PHP专卖店对象???
因此,例如
$size = strlen(serialize($object));
只是一个想法?
另一种混乱,但可能是准确的想法:
假设自实例已经操纵了几次一个类的实例变量:
$DB; // database access class for eg.
$mem = memory_get_usage();
$DB_tmp = clone $DB;
$mem = memory_get_usage() - $mem;
unset($DB_tmp);
$ MEM可能是分配到$ DB内存的具体数额;
我不认为这是完全可能的; 我从来没有见过任何可能让你获得一个物体的大小在内存中。
一个解决方案得到相当粗略的想法可能是一种串行数据,并在使用strlen的......但是,这真的是一个估算的东西......我不太依赖于这样的事情,其实。 ..
即使debug_zval_dump
没有做到这一点:它在输出中的变量和引用计数的数据,而不是使用的内存:
$obj = new stdClass();
$obj->a = 152;
$obj->b = 'test';
echo '<pre>';
debug_zval_dump($obj);
echo '</pre>';
只会让你:
object(stdClass)#1 (2) refcount(2){
["a"]=>
long(152) refcount(1)
["b"]=>
string(4) "test" refcount(1)
}
由于克隆 (从Prof83的答案 ),我没有工作,我试图序列化和反序列我要测量其大小变量:
function getMemoryUsage($var) {
$mem = memory_get_usage();
$tmp = unserialize(serialize($var));
// Return the unserialized memory usage
return memory_get_usage() - $mem;
}
我认为它报告更好的结果,至少对我来说。
如果你只是想知道物体的大小,而不是你的下一个代码, return
它的浏览器,你可以看到网络有多大传输的对象。