Получение размера в памяти объекта в PHP?

Существует способ получить общую память, используемую PHP (memory_get_usage()), но как получить размер в памяти отдельного объекта?

Я, очевидно, не говорю о count(), так как я хочу количество байтов в потенциально сложной структуре данных.

Ответ 1

Вы можете вызвать memory_get_usage() до и после выделения вашего класса, как показано в в этом примере из IBM. Вы даже можете создать оболочку для этого, возможно, сохраняя результат в переменной-члене самого сложного класса.

EDIT:

Чтобы прояснить часть хранения выделенного объема памяти, вы можете сделать что-то вроде этого:

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

В любой момент в будущем вы можете проверить allocizeize, чтобы увидеть, насколько большой этот объект был во время выделения. Если вы добавите к нему после выделения, тем не менее, allocSize больше не будет точным.

Ответ 2

Не имеет смысла пытаться сериализовать объект и читать длину строки? Очевидно, что это будет несколько байтов, потому что сериализованная строка имеет 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;

Ответ 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)
}

Ответ 4

Так как клон (из Prof83 answer) не работал у меня, я попытался сериализовать и неэтериализовать переменную, размер которой я хочу для измерения:

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

Я думаю, что он сообщает о лучших результатах, по крайней мере для меня.

Ответ 5

Если вы просто хотите узнать размер объекта, а не для своего следующего кода, return его в браузере, и вы можете увидеть, сколько передается сеть  объект.