Получение размера в памяти объекта в PHP?
Есть способ получить общую память, используемую PHP (memory_get_usage()
), но как получить размер в памяти отдельного объекта?
Я, очевидно, не говорю о count()
, так как мне нужно количество байтов в потенциально сложной структуре данных.
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 больше не будет точным.
Не имеет ли смысла попробовать сериализовать объект и прочитать длину строки? Очевидно, что это будет несколько байтов, потому что сериализованная строка будет иметь 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;
Я не думаю, что это вполне возможно; Я никогда не видел ничего, что позволило бы вам получить размер объекта в памяти.
Решением для получения довольно приблизительного представления может быть своего рода сериализация ваших данных и использование 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)
}
Поскольку клонирование (из ответа Prof83 ) не сработало для меня, я попытался сериализовать и отменить сериализацию переменной, размер которой я хочу измерить:
function getMemoryUsage($var) {
$mem = memory_get_usage();
$tmp = unserialize(serialize($var));
// Return the unserialized memory usage
return memory_get_usage() - $mem;
}
Я думаю, что это дает лучшие результаты, по крайней мере для меня.
Если вы просто хотите узнать размер объекта, а не для вашего следующего кода, return
отправьте его в браузер, и вы сможете увидеть, насколько сеть передает
объект.