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

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

  •  27
  • Artem Russakovskii  · 技术社区  · 15 年前

    有一种方法可以获得php使用的总内存( memory_get_usage() )但是一个人如何得到一个单独物体的内存大小呢?

    我显然不是在说 count() 因为我需要一个潜在的复杂数据结构中的字节数。

    5 回复  |  直到 8 年前
        1
  •  17
  •   Eric J.    15 年前

    可以在分配类之前和之后调用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    13 年前

    尝试序列化对象并读取字符串长度是否没有意义?很明显,它将关闭几个字节,因为序列化字符串将有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);
    

    $mem可以是分配给$db的确切内存量;

        3
  •  3
  •   Pascal MARTIN    15 年前

    我不认为这是完全可能的;我从未见过任何东西能让你在记忆中得到一个物体的大小。

    得到一个相当粗略的想法的解决方案可能是某种程度上序列化您的数据,并使用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)
    }
    
        4
  •  1
  •   Community CDub    8 年前

    自从 克隆 (从 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    8 年前

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