【发布时间】:2010-11-07 16:57:25
【问题描述】:
如何在 PHP 中查找对象使用的内存? (c 的 sizeof)。我想查找的对象是一个包含字符串和整数的字典,因此很难手动计算。 php中的字符串也可以根据编码(utf8等)的不同长度正确吗?
【问题讨论】:
标签: php memory memory-management
如何在 PHP 中查找对象使用的内存? (c 的 sizeof)。我想查找的对象是一个包含字符串和整数的字典,因此很难手动计算。 php中的字符串也可以根据编码(utf8等)的不同长度正确吗?
【问题讨论】:
标签: php memory memory-management
你可以使用memory_get_usage()。
在创建对象之前运行一次,然后在创建对象后再次运行,并获取两个结果之间的差异。
【讨论】:
echo memory_get_usage()得到的结果,它的单位假设在KB!!!我将内存大小除以 1024!获取实际消耗的内存大小。
要了解对象大小,请尝试
strlen(serialize($object));
这绝不是准确的,而是一种获取数字进行比较的简单方法。
【讨论】:
如果需要知道已经创建的对象或数组的大小,可以使用下面的代码来查找。
<?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);
?>
这实际上创建了数组结构的副本和它的所有成员。
一个不是 100% 准确但仍然有效的版本也是:
<?php
$old = memory_get_usage();
$dummy = unserialize(serialize($src));
$mem = memory_get_usage();
$size = abs($mem - $old);
希望对已经构建对象的情况有所帮助。
【讨论】:
此方法将数组转换为 json 字符串并确定该字符串的长度。结果应该与数组的大小非常相似(两者都有分隔符来分隔数组的成员或字符串化的 json)
strlen(json_encode(YourArray))
【讨论】:
这个方法可以帮到你:
function getVariableUsage($var) {
$total_memory = memory_get_usage();
$tmp = unserialize(serialize($var));
return memory_get_usage() - $total_memory;
}
$var = "Hey, what's you doing?";
echo getVariableUsage($var);
【讨论】:
我不知道有没有一种简单的方法可以在 PHP 中获取对象的大小。你可能只需要做一个算法
我确信有更好的方法,但这会奏效,即使会很痛苦。
【讨论】: