web-dev-qa-db-ja.com

PHPでオブジェクトが使用するメモリを見つける方法は? (のサイズ)

PHPでオブジェクトが使用するメモリを見つける方法は? (cのsizeof)。私が知りたいオブジェクトは、文字列と整数を含む辞書なので、手動で計算するのは難しいです。また、PHPの文字列は、エンコーディング(utf8など)に応じて長さを変えることができますか?

30
erotsppa

memory_get_usage() を使用できます。

オブジェクトを作成する前に一度実行してから、オブジェクトを作成した後にもう一度実行して、2つの結果の違いを確認します。

45
zombat

オブジェクトのサイズについてのアイデアを得るには、

strlen(serialize($object));

これは決して正確ではありませんが、比較のために数値を取得する簡単な方法です。

12
rekowski

すでに作成されているオブジェクトまたは配列のサイズを知る必要がある場合は、次のコードを使用して確認できます。

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

これは基本的に配列構造のコピーandのすべてのメンバーを作成します。

100%正確ではありませんが、まだ機能しているバージョンも次のとおりです。

<?php

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

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

オブジェクトが既にビルドされている場合に役立つことを願っています。

8
LionsAd