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

ero*_*ppa 30 php memory memory-management

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

zom*_*bat 45

你可以使用memory_get_usage().

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

  • 在内存中执行此操作的另一种方法是获取内存使用量,克隆对象,获取新内存使用量并取消设置克隆.虽然有足迹,所以不要滥用...... :) (2认同)
  • 是的?好吧,如果 PHP 在调用第二个 memory_get_usage 之前决定使用内存怎么办?...非常脆弱的解决方案... (2认同)
  • 这个答案已经在多个问题上被揭穿了,因为 memory_get_usage() 获取整个 PHP 脚本的已用内存,并且不会分离诸如开销之类的东西,因此比较它的结果并不能给出对象的大小。 (2认同)

小智 12

要了解对象大小,请尝试

strlen(serialize($object));
Run Code Online (Sandbox Code Playgroud)

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


小智 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);
?>
Run Code Online (Sandbox Code Playgroud)

这实际上创建了数组结构及其所有成员的副本.

一个不是100%准确但仍在工作的版本也是:

<?php

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

$size = abs($mem - $old);
Run Code Online (Sandbox Code Playgroud)

希望有助于对象已经构建的情况.