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


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

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

Author: hakre, 2009-08-29

5 answers

Вы можете вызвать 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;
}

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

 15
Author: Eric J., 2009-08-29 19:17:13

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

 12
Author: Prof83, 2011-10-20 08:59:41

Я не думаю, что это вполне возможно; Я никогда не видел ничего, что позволило бы вам получить размер объекта в памяти.

Решением для получения довольно приблизительного представления может быть своего рода сериализация ваших данных и использование 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)
}
 3
Author: Pascal MARTIN, 2009-08-29 16:51:01

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

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

Я думаю, что это дает лучшие результаты, по крайней мере для меня.

 1
Author: Iván Pérez, 2017-05-23 12:26:21

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

 -1
Author: haofly, 2017-03-22 09:52:45