Получение размера в памяти объекта в PHP? - PullRequest
29 голосов
/ 29 августа 2009

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

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

Ответы [ 5 ]

17 голосов
/ 29 августа 2009

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

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

12 голосов
/ 21 марта 2011

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

3 голосов
/ 29 августа 2009

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

Решением для получения довольно грубой идеи может быть своего рода сериализация ваших данных и использование strlen для этого ... Но это действительно будет чем-то оценочным ... Я бы не стал полностью полагаться на что-либо подобное. на самом деле ...


Даже debug_zval_dump этого не делает: он выводит данные в переменную и счет, но не в используемую память:

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

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

достанет только вам:

object(stdClass)#1 (2) refcount(2){
  ["a"]=>
  long(152) refcount(1)
  ["b"]=>
  string(4) "test" refcount(1)
}
1 голос
/ 12 декабря 2014

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

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

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

0 голосов
/ 22 марта 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...