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

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

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

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

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

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

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

Решение для получения довольно грубой идеи может быть связано с сериализацией ваших данных и использованием 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) } 

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

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

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

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