在PHP的内存中获取大小?

Art*_*kii 32 php oop size object

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

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

Eri*_* J. 17

您可以在分配类之前和之后调用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;
}
Run Code Online (Sandbox Code Playgroud)

在将来的任何时候,您都可以检查allocatedSize以查看该对象在分配时的大小.但是,如果在分配它之后添加它,则allocateSize将不再准确.

  • 如果PHP仅在“错误的时间”决定释放已分配的内存,该怎么办?我真的不知道PHP何时释放内存(我想应该是“何时需要”),但是我猜想这种释放会带来一些问题吗?尤其是PHP 5.3为循环引用引入了垃圾回收器? (2认同)

Pro*_*f83 12

尝试序列化对象并读取字符串长度是否没有意义?显然它将关闭几个字节,因为序列化字符串将具有s:'string'因此s:''是额外的字节...除非serialize可以与PHP存储对象相同的方式???

所以例如

$size = strlen(serialize($object));
Run Code Online (Sandbox Code Playgroud)

只是一个想法?

另一个混乱但可能准确的想法:

假设一个类实例变量自实例化以来被操作了几次:

$DB; // database access class for eg.
$mem = memory_get_usage();
$DB_tmp = clone $DB;
$mem = memory_get_usage() - $mem;
unset($DB_tmp);
Run Code Online (Sandbox Code Playgroud)

$ mem可能是分配给$ DB的确切内存量;