代码之家  ›  专栏  ›  技术社区  ›  Artem Russakovskii

在PHP中获取对象的内存大小?

  •  39
  • Artem Russakovskii  · 技术社区  · 16 年前

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

    我显然不是在说 count()

    5 回复  |  直到 13 年前
        1
  •  17
  •   Eric J.    16 年前

    您可以在分配类之前和之后调用memory_get_usage(),如图所示 this example from 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将不再准确。

        2
  •  12
  •   Prof    14 年前

    尝试序列化对象并读取字符串长度是没有意义的吗?显然,这将有几个字节的偏差,因为序列化字符串将有s:'string',因此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);
    

        3
  •  3
  •   Pascal MARTIN    16 年前

    我认为这不太可能;我从未见过任何东西可以让你得到内存中对象的大小。

    一个获得相当粗略想法的解决方案可能是对数据进行序列化,并在上面使用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)
    }
    
        4
  •  1
  •   Community Mohan Dere    9 年前

    自从 克隆 Prof83's answer )对我来说不起作用,我试图序列化和取消序列化我想测量其大小的变量:

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

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

        5
  •  -2
  •   haofly    9 年前

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