PHP bir nesnenin bellekte boyutu alma?

3 Cevap php

PHP kullanarak (memory_get_usage()) ama nasıl biri bireysel bir nesnenin bellekte boyutunu alıyor toplam bellek almak için bir yolu var mı?

Ben bir potansiyel karmaşık veri yapısı bayt sayısını istediğiniz gibi ben açıkçası count() bahsetmiyorum.

3 Cevap

Sen önce ve this example from IBM gösterildiği gibi sınıf ayrıldıktan sonra () memory_get_usage çağırabilirsiniz. Hatta muhtemelen karmaşık sınıfın kendisi bir üye değişkeni üzerinde sonucunu saklamak, bunu yapmak için bir sarıcı oluşturmak olabilir.

EDIT:

Ayrılan bellek boyutunu saklanması hakkında kısmını açıklığa kavuşturmak için, böyle bir şey yapabilirsiniz:

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;
}

Gelecekte herhangi bir noktada, bu nesne tahsisat anda ne kadar büyük olduğunu görmek için allocatedSize kontrol edebilir. Bunu ayrıldıktan sonra buna eklerseniz, olsa, allocatedSize artık doğru olacaktır.

O nesne seri ve dize uzunluğunu okuma denemek için mantıklı olmaz mı? 'String', bu nedenle s: Açıkçası onu sıralanmış dize s olurdu çünkü kapalı birkaç bayt olacaktır'' serialize aynı yolu olabilir sürece ... ekstra bayt olan PHP mağaza nesneler mi??

Bu nedenle, örneğin

$size = strlen(serialize($object));

Sadece bir düşünce?

Başka dağınık ama muhtemelen doğru bir düşünce:

Örnekleme beri birkaç kez manipüle edilmiş bir sınıf örneği değişkeni varsayarsak:

$DB; // database access class for eg.
$mem = memory_get_usage();
$DB_tmp = clone $DB;
$mem = memory_get_usage() - $mem;
unset($DB_tmp);

$ Mem $ DB için ayrılan bellek tam miktarı olabilir;

Ben bu oldukça mümkün olduğunu sanmıyorum; Ben bellekte bir nesnenin boyutunu almak için izin verecek bir şey görmedim.

Güzel bir fikir almak için bir çözüm tür verileri serialize olmak, ve bu konuda strlen kullanmak ... Ama bu gerçekten bir tahminin bir şey olacak belki ... Ben oldukça, aslında böyle bir şey dayanmaz olmaz. ..


Bir değişkenin ve RefCount verileri çıktıya onu, ancak kullanılan bellek değil: Hatta debug_zval_dump bunu yapmaz:

$obj = new stdClass();
$obj->a = 152;
$obj->b = 'test';

echo '<pre>';
debug_zval_dump($obj);
echo '</pre>';

sadece alacak:

object(stdClass)#1 (2) refcount(2){
  ["a"]=>
  long(152) refcount(1)
  ["b"]=>
  string(4) "test" refcount(1)
}