有一种方法可以获得PHP使用的总内存(memory_get_usage()
)但是如何获得单个对象的内存大小?
我显然不是在谈论count()
,因为我想要一个可能复杂的数据结构中的字节数。
答案 0 :(得分:17)
如this example from IBM所示,您可以在分配课程之前和之后调用memory_get_usage()。您甚至可以创建一个包装器来执行此操作,可能将结果存储在复杂类本身的成员变量中。
编辑:
为了阐明存储分配的内存大小的部分,你可以这样做:
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以查看该对象在分配时的大小。但是,如果在分配之后添加它,则allocateSize将不再准确。
答案 1 :(得分:12)
尝试序列化对象并读取字符串长度是否有意义?显然它将关闭几个字节,因为序列化字符串将具有s:'string'因此s:''是额外字节...除非serialize可以与PHP存储对象相同的方式???
所以例如
$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的确切内存量;
答案 2 :(得分:3)
我认为这不太可能;我从来没有见过任何能让你在内存中获得对象大小的东西。
获得一个非常粗略的想法的解决方案可能是对数据进行序列化,并使用strlen ...但这确实是一种估计......我不会完全依赖于这样的东西,实际上......
即使debug_zval_dump
不这样做:它输出变量和refcount中的数据,但不输出使用的内存:
$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)
}
答案 3 :(得分:1)
由于 clone (来自Prof83's answer)对我不起作用,我尝试序列化并反序列化我想要测量其大小的变量:
function getMemoryUsage($var) {
$mem = memory_get_usage();
$tmp = unserialize(serialize($var));
// Return the unserialized memory usage
return memory_get_usage() - $mem;
}
我认为它会报告更好的结果,至少对我而言。
答案 4 :(得分:-2)
如果你只是想知道对象的大小,而不是你的下一个代码,return
它到浏览器,你可以看到网络传输了多少
对象。