Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中获取对象的内存大小?_Php_Oop_Object_Size - Fatal编程技术网

在PHP中获取对象的内存大小?

在PHP中获取对象的内存大小?,php,oop,object,size,Php,Oop,Object,Size,有一种方法可以获取PHP使用的总内存(memory\u get\u usage()),但是如何获取单个对象的内存大小呢 我显然不是在谈论计数(),因为我想要一个潜在的复杂数据结构中的字节数。我认为这不太可能;我从来没有见过任何东西可以让你在内存中得到一个物体的大小 要获得一个相当粗略的想法,一个解决方案可能是将您的数据序列化,并在上面使用strlen。。。但这确实是一种估计。。。事实上,我不太相信这样的事情 甚至不这样做:它输出变量中的数据和refcount,但不输出所使用的内存: $obj

有一种方法可以获取PHP使用的总内存(
memory\u get\u usage()
),但是如何获取单个对象的内存大小呢


我显然不是在谈论计数(),因为我想要一个潜在的复杂数据结构中的字节数。

我认为这不太可能;我从来没有见过任何东西可以让你在内存中得到一个物体的大小

要获得一个相当粗略的想法,一个解决方案可能是将您的数据序列化,并在上面使用strlen。。。但这确实是一种估计。。。事实上,我不太相信这样的事情


甚至不这样做:它输出变量中的数据和refcount,但不输出所使用的内存:

$obj = new stdClass();
$obj->a = 152;
$obj->b = 'test';

echo '<pre>';
debug_zval_dump($obj);
echo '</pre>';

您可以在分配类之前和之后调用memory\u get\u usage(),如中所示。您甚至可以创建一个包装器来实现这一点,可能将结果存储在复杂类本身的成员变量上

编辑:

要澄清存储分配内存大小的部分,可以执行以下操作:

$size = strlen(serialize($object));

在将来的任何时候,您都可以检查allocatedSize以查看在分配时该对象有多大。但是,如果在分配对象后添加到它,allocatedSize将不再准确。

尝试序列化对象并读取字符串长度是否有意义?很明显,它将减少几个字节,因为序列化字符串将有s:'string',因此s:''是额外的字节。。。除非序列化可以与PHP存储对象的方式相同

比如说

$DB; // database access class for eg.
$mem = memory_get_usage();
$DB_tmp = clone $DB;
$mem = memory_get_usage() - $mem;
unset($DB_tmp);
只是一个想法

另一个混乱但可能准确的想法:

假设类实例变量自实例化以来已被操作过几次:

function getMemoryUsage($var) {
    $mem = memory_get_usage();
    $tmp = unserialize(serialize($var));
    // Return the unserialized memory usage
    return memory_get_usage() - $mem;
}

$mem可以是分配给$DB的确切内存量

由于克隆(from)对我不起作用,我尝试序列化并取消序列化要测量其大小的变量:


我认为至少对我来说,它报告了更好的结果。

如果您只想知道对象的大小,而不是下一个代码,请将它返回到浏览器,您可以看到网络传输了多少数据
对象。

如果PHP决定在“错误的时间”释放保留分配的内存,该怎么办?我真的不知道PHP何时释放内存(我想是“在需要时”),但我猜这种释放可能会带来一些问题?特别是PHP5.3为循环引用引入的垃圾收集器?是的,但是除了Pascal提到的,我希望能够在不同的时间发现这一点,而不仅仅是在分配时间。我想找出这一点。@Pascal:PHP不会释放仍被正在使用的对象引用的内存。循环引用是指A引用B和B引用A,但没有其他引用A或B。因此,只要程序仍能以任何方式引用内存,内存就不会被释放。@Artem:我在帖子中提到,您可以将分配的大小保留为数据结构的一部分。我现在就编辑这篇文章,让它更清楚。它不可靠。在加载前后使用simpleXML和打印内存进行了测试+在数兆字节的xml文件(在PHP5.5上)上使用内存获取峰值进行了测试。非常有趣。我的下一个问题实际上是让refcounts找出内存泄漏的原因。谢谢克隆人不适合我(我不知道为什么)。克隆对象后,它总是报告100字节。您没有使用
$tmp
variable在最后一行,memory\u get\u usage现在等于$mem加上$tmp的大小。变量本身可能无法使用,但它是必需的。
$DB; // database access class for eg.
$mem = memory_get_usage();
$DB_tmp = clone $DB;
$mem = memory_get_usage() - $mem;
unset($DB_tmp);
function getMemoryUsage($var) {
    $mem = memory_get_usage();
    $tmp = unserialize(serialize($var));
    // Return the unserialized memory usage
    return memory_get_usage() - $mem;
}