Подтвердить что ты не робот

Как найти память, используемую объектом в PHP? (размер)

Как найти память, используемую объектом в PHP? (c sizeof). Объект, о котором я хочу узнать, это словарь со строками и ints, поэтому его сложно вычислить вручную. Кроме того, строка в php может иметь разную длину в зависимости от кодировки (utf8 и т.д.) Правильно?

4b9b3361

Ответ 1

Вы можете использовать memory_get_usage().

Запустите его один раз перед созданием вашего объекта, затем снова после создания вашего объекта и получите разницу между двумя результатами.

Ответ 2

Чтобы получить представление о размере объектов, попробуйте

strlen(serialize($object));

Это не совсем точный, но простой способ получить число для сравнения.

Ответ 3

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

<?php

function rec_copy($src) {
  if (is_string($src)) {
    return str_replace('SOME_NEVER_OCCURING_VALUE_145645645734534523', 'XYZ', $src);
  }

  if (is_numeric($src)) {
    return ($src + 0);
  }

  if (is_bool($src)) {
    return ($src?TRUE:FALSE);
  }
  if (is_null($src)) {
    return NULL;
  }

  if (is_object($src)) {
    $new = (object) array();
    foreach ($src as $key => $val) {
      $new->$key = rec_copy($val);
    }
    return $new;
  }

  if (!is_array($src)) {
    print_r(gettype($src) . "\n");
    return $src;
  }

  $new = array();

  foreach ($src as $key => $val) {
    $new[$key] = rec_copy($val);
  }
  return $new;
}

$old = memory_get_usage();
$dummy = rec_copy($src);
$mem = memory_get_usage();

$size = abs($mem - $old);
?>

Это по существу создает копию структуры массива и всех ее членов.

А не 100% точная, но все еще рабочая версия также:

<?php

$old = memory_get_usage();
$dummy = unserialize(serialize($src));
$mem = memory_get_usage();

$size = abs($mem - $old);

Надеюсь, что это поможет в случаях, когда объект уже создан.

Ответ 4

Я не знаю, что есть простой способ получить размер объекта в PHP. Вам просто нужно сделать алгоритм, который

  • Подсчитывает ints
  • Умножает количество ints по размеру int на жестком диске
  • Преобразование символов в строки в ASCII и
  • Умножьте значения ASCII на сколько они занимают на диске

Я уверен, что есть лучший способ, но это сработает, хотя это будет боль.