Как найти память, используемую объектом в PHP? (c sizeof). Объект, о котором я хочу узнать, это словарь со строками и ints, поэтому его сложно вычислить вручную. Кроме того, строка в php может иметь разную длину в зависимости от кодировки (utf8 и т.д.) Правильно?
Как найти память, используемую объектом в PHP? (размер)
Ответ 1
Вы можете использовать memory_get_usage().
Запустите его один раз перед созданием вашего объекта, затем снова после создания вашего объекта и получите разницу между двумя результатами.
Ответ 2
Чтобы получить представление о размере объектов, попробуйте
strlen(serialize($object));
Это не совсем точный, но простой способ получить число для сравнения.
Ответ 3
Если вам нужно знать размер уже созданного объекта или массива, вы можете использовать следующий код, чтобы узнать его.
<?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);
Надеюсь, что это поможет в случаях, когда объект уже создан.
Ответ 4
Я не знаю, что есть простой способ получить размер объекта в PHP. Вам просто нужно сделать алгоритм, который
- Подсчитывает ints
- Умножает количество ints по размеру int на жестком диске
- Преобразование символов в строки в ASCII и
- Умножьте значения ASCII на сколько они занимают на диске
Я уверен, что есть лучший способ, но это сработает, хотя это будет боль.