PHPが使用しているメモリの合計(memory_get_usage()
)を取得する方法はありますが、個々のオブジェクトのメモリサイズをどのように取得するのですか?PHPのオブジェクトのメモリサイズを取得していますか?
潜在的に複雑なデータ構造のバイト数を求めているので、私は明らかにcount()
について話していません。
PHPが使用しているメモリの合計(memory_get_usage()
)を取得する方法はありますが、個々のオブジェクトのメモリサイズをどのように取得するのですか?PHPのオブジェクトのメモリサイズを取得していますか?
潜在的に複雑なデータ構造のバイト数を求めているので、私は明らかにcount()
について話していません。
this example from IBMに示すように、クラスを割り当てる前と後でmemory_get_usage()を呼び出すことができます。おそらく結果を複合クラス自体のメンバー変数に格納するために、これを行うためのラッパーを作成することもできます。
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;
}
を、あなたはどのように大きな見てallocatedSizeをチェックできますそのオブジェクトは割り当て時にあった。それを割り当てた後に追加すると、allocatedSizeはもはや正確ではありません。
これはかなり可能だとは思いません。私はあなたがメモリ内のオブジェクトのサイズを得ることができる何かを見たことがない。
かなり大まかなアイデアを得るための解決策は、あなたのデータをシリアル化して、それにstrlenを使うことかもしれません...しかし、それは実際には見積もりになるでしょう...私は、使用されるメモリ変数内のデータと参照カウントouputをそれではなく:それ、実際には...
はさえdebug_zval_dump
はそれをしません
$obj = new stdClass();
$obj->a = 152;
$obj->b = 'test';
echo '<pre>';
debug_zval_dump($obj);
echo '</pre>';
はあなたを取得します。
object(stdClass)#1 (2) refcount(2){
["a"]=>
long(152) refcount(1)
["b"]=>
string(4) "test" refcount(1)
}
非常に興味深い。私の次の質問は、実際になぜメモリリークがあるのかを理解するためにrefcountsを取得することでした。ありがとう! –
オブジェクトをシリアル化して文字列の長さを読み取るのは意味がありませんか?明らかに、シリアライズされた文字列にはs: 'string'があるため、いくつかのバイトがオフになります。ただ、思考
ので、例えば
$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に割り当てられたメモリの正確な量かもしれません;
**クローン**は私のために働いていません(なぜか分かりません)。オブジェクトのクローン作成後、常に100バイトを報告します。 –
(Prof83's answerから)クローンが私のために動作しませんでしたので、私はそのサイズが、私が測定したい変数をシリアル化し、アンシリアライズしてみました:
function getMemoryUsage($var) {
$mem = memory_get_usage();
$tmp = unserialize(serialize($var));
// Return the unserialized memory usage
return memory_get_usage() - $mem;
}
私はそれが、少なくとも、より良い結果を報告すると思います私のために。
あなたは '$ tmp'変数を使用しませんでした –
オブジェクトのサイズを知りたいだけで、次のコードではない場合は、return
をブラウザに送信すると、ネットワークがどれくらいオブジェクトを送信しているかがわかります。
PHPが割り当てられたままのメモリを解放することを決定した場合、単に「間違った時間」になった場合私はPHPがいつメモリを解放するのかは分かりませんが(私は思いますが、「必要なとき」)、この解放がいくつか問題を引き起こす可能性があると思いますか?特に循環参照のためにPHP 5.3で導入されたガベージコレクタについては? –
ええ、Pascalが言及したことに加えて、割り当て時だけでなく、異なる時にこれを見つけることができるようにしたい。私はこれを道路の下の多くのラインから見つけたいと思っています。 –
@Pascal:PHPは、積極的に使用されているオブジェクトによって参照されているメモリを解放しません。巡回参照とはA参照BとB参照Aを意味しますが、AやBのどちらかを参照するものはありません。したがって、プログラムは何らかの方法で参照できる限り、メモリは解放されません。 –