如何在PHP中查找对象使用的内存? (的sizeof)

时间:2009-07-02 16:38:39

标签: php memory memory-management

如何在PHP中查找对象使用的内存? (c的大小)。我想要找到的对象是一个字符串,其中包含字符串和整数,因此很难手动计算它。 php中的字符串也可以是不同的长度,具体取决于编码(utf8等)是否正确?

6 个答案:

答案 0 :(得分:44)

您可以使用memory_get_usage()

在创建对象之前运行一次,然后在创建对象后再次运行它,并获取两个结果之间的差异。

答案 1 :(得分:11)

要了解对象大小,请尝试

strlen(serialize($object));

这绝不是准确的,而是一种简单的方法来获得一个数字进行比较。

答案 2 :(得分:8)

如果您需要知道已创建的对象或数组的大小,可以使用以下代码来查找它。

<?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);

希望对于已经构建对象的情况有所帮助。

答案 3 :(得分:0)

这个方法可以帮到你:

function getVariableUsage($var) {
 $total_memory = memory_get_usage();
 $tmp = unserialize(serialize($var));
 return memory_get_usage() - $total_memory; 
}

$var = "Hey, what's you doing?";
echo getVariableUsage($var);

https://www.phpflow.com/

答案 4 :(得分:0)

此方法将数组转换为 json 字符串并确定该字符串的长度。结果应该与数组的大小非常相似(两者都将有分隔符来分割数组的成员或字符串化的 json) strlen(json_encode(YourArray))

答案 5 :(得分:-6)

我不知道有一种简单的方法可以在PHP中获取对象的大小。你可能只需做一个

的算法
  1. 计算整数
  2. 将int的数量乘以硬盘上int的大小
  3. 将字符串中的字符转换为ASCII和
  4. 将ASCII值乘以它们在磁盘上的占用量
  5. 我确信有更好的方法,但这会奏效,即使这会很痛苦。