在PHP的内存中获取大小?

时间:2009-08-29 16:44:54

标签: php oop object size

有一种方法可以获得PHP使用的总内存(memory_get_usage())但是如何获得单个对象的内存大小?

我显然不是在谈论count(),因为我想要一个可能复杂的数据结构中的字节数。

5 个答案:

答案 0 :(得分:17)

this example from IBM所示,您可以在分配课程之前和之后调用memory_get_usage()。您甚至可以创建一个包装器来执行此操作,可能将结果存储在复杂类本身的成员变量中。

编辑:

为了阐明存储分配的内存大小的部分,你可以这样做:

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以查看该对象在分配时的大小。但是,如果在分配之后添加它,则allocateSize将不再准确。

答案 1 :(得分:12)

尝试序列化对象并读取字符串长度是否有意义?显然它将关闭几个字节,因为序列化字符串将具有s:'string'因此s:''是额外字节...除非serialize可以与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的确切内存量;

答案 2 :(得分:3)

我认为这不太可能;我从来没有见过任何能让你在内存中获得对象大小的东西。

获得一个非常粗略的想法的解决方案可能是对数据进行序列化,并使用strlen ...但这确实是一种估计......我不会完全依赖于这样的东西,实际上......


即使debug_zval_dump不这样做:它输出变量和refcount中的数据,但不输出使用的内存:

$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)
}

答案 3 :(得分:1)

由于 clone (来自Prof83's answer)对我不起作用,我尝试序列化并反序列化我想要测量其大小的变量:

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

我认为它会报告更好的结果,至少对我而言。

答案 4 :(得分:-2)

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