Существует ли функция в PHP (или расширение PHP) для обнаружения, сколько памяти данная переменная использует? sizeof
просто говорит мне количество элементов/свойств.
memory_get_usage
помогает в этом, это дает мне емкость памяти, используемую целым сценарием. Существует ли способ сделать это для единственной переменной?
Обратите внимание, что это находится на машине разработки, таким образом загружение расширений или отладчиков выполнимо.
Нет прямого способа получить использование памяти одной переменной, но, как предложил Гордон, вы можете использовать memory_get_usage
. Это вернет общий объем выделенной памяти, поэтому вы можете использовать обходной путь и измерить использование до и после, чтобы получить использование одной переменной. Это немного взломано, но должно работать.
$start_memory = memory_get_usage();
$foo = "Some variable";
echo memory_get_usage() - $start_memory;
Обратите внимание, что это никоим образом не является надежным методом, вы не можете быть уверены, что ничто другое не затрагивает память при присвоении переменной, поэтому его следует использовать только как приближение.
Фактически вы можете превратить это в функцию, создав копию переменной внутри функции и измерив используемую память. Не тестировал это, но в принципе не вижу в этом ничего плохого:
function sizeofvar($var) {
$start_memory = memory_get_usage();
$tmp = unserialize(serialize($var));
return memory_get_usage() - $start_memory;
}
Нет, нет. Но вы можете сериализовать($var)
и проверить strlen
результата на аппроксимацию.
См .:
memory_get_usage ()
- Возвращает объем памяти, выделенной PHP memory_get_peak_usage ()
- Возвращает пик памяти, выделенной PHP Обратите внимание, что это не тем не менее, дать вам использование памяти определенной переменной. Но вы можете вызывать эти функции до и после присвоения переменной, а затем сравнивать значения. Это должно дать вам представление об используемой памяти.
Вы также можете взглянуть на расширение PECL Memtrack , хотя документации немного не хватает, если не сказать, практически не существует.
Никогда не пробовал, но трассировки Xdebug с помощью xdebug.collect_assignment может быть достаточно.