获得大小在PHP对象的内存?(Getting size in memory of an object

2019-07-04 01:29发布

有一种方式来获得PHP使用的总内存( memory_get_usage()但如何在一个单个对象的内存获得大小?

我显然不是在谈论count()因为我想字节的潜在复杂的数据结构的数量。

Answer 1:

您可以调用之前和中所示分配好自己的课后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将不再准确。



Answer 2:

难道没有意义的尝试序列化对象和读取字符串的长度? 显然,这将是几个字节了,因为序列化的字符串将有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内存的具体数额;



Answer 3:

我不认为这是完全可能的; 我从来没有见过任何可能让你获得一个物体的大小在内存中。

一个解决方案得到相当粗略的想法可能是一种串行数据,并在使用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)
}


Answer 4:

由于克隆 (从Prof83的答案 ),我没有工作,我试图序列化和反序列我要测量其大小变量:

function getMemoryUsage($var) {
    $mem = memory_get_usage();
    $tmp = unserialize(serialize($var));
    // Return the unserialized memory usage
    return memory_get_usage() - $mem;
}

我认为它报告更好的结果,至少对我来说。



Answer 5:

如果你只是想知道物体的大小,而不是你的下一个代码, return它的浏览器,你可以看到网络有多大传输的对象。



文章来源: Getting size in memory of an object in PHP?