Есть ли функция в PHP (или расширении PHP), чтобы узнать, сколько памяти использует данная переменная? sizeof
просто сообщает мне количество элементов / свойств.
memory_get_usage
помогает в том, что он дает мне размер памяти, используемый всем скриптом. Есть ли способ сделать это для одной переменной?
Обратите внимание, что это на машине разработки, поэтому загрузка расширений или инструментов отладки возможна.
Ответы:
Возможно, вам понадобится профилировщик памяти. Я собрал информацию из ТАК, но я скопировал кое-что важное, что также может вам помочь.
Как вы, наверное, знаете, Xdebug отказался от поддержки профилирования памяти с версии 2. *. Найдите строку «удаленные функции» здесь: http://www.xdebug.org/updates.php
Другие параметры профилировщика
профилировщик памяти php
https://github.com/arnaud-lb/php-memory-profiler . Вот что я сделал на своем сервере Ubuntu, чтобы включить его:
А потом в моем коде:
Наконец откройте
callgrind.out
файл с помощью KCachegrindИспользование Google gperftools (рекомендуется!)
Прежде всего установите Google gperftools , загрузив последний пакет здесь: https://code.google.com/p/gperftools/
Потом как всегда:
Теперь в вашем коде:
Затем откройте свой терминал и запустите:
pprof создаст новое окно в вашем существующем сеансе браузера, как показано ниже:
Xhprof + Xhgui (лучший, на мой взгляд, для профилирования процессора и памяти)
С помощью Xhprof и Xhgui вы также можете профилировать использование процессора или только использование памяти, если это ваша проблема на данный момент. Это очень полные решения, они дают вам полный контроль, а журналы могут быть записаны как на mongo, так и в файловой системе.
Подробнее см. Здесь .
Черный огонь
Blackfire - это профилировщик PHP от SensioLabs, ребята из Symfony2 https://blackfire.io/
Если вы используете puphpet для настройки своей виртуальной машины, вы будете рады узнать, что она поддерживается ;-)
Xdebug и отслеживание использования памяти
XDEBUG2 - это расширение для PHP. Xdebug позволяет вам регистрировать все вызовы функций, включая параметры и возвращаемые значения в файл в различных форматах. Существует три формата вывода. Один предназначен для считывания человеком трассы, другой больше подходит для компьютерных программ, поскольку его легче анализировать, а последний использует HTML для форматирования трассировки. Вы можете переключаться между двумя разными форматами с помощью настройки. Пример доступен здесь
форп
forp простой, ненавязчивый, ориентированный на производство профилировщик PHP. Некоторые из функций:
измерение времени и выделенной памяти для каждой функции
использование процессора
файл и номер строки вызова функции
вывод в формате Google Trace Event
заголовок функций
группировка функций
псевдонимы функций (полезно для анонимных функций)
DBG
DBG - это полнофункциональный отладчик php, интерактивный инструмент, который помогает вам отлаживать скрипты php. Он работает на веб-сервере производства и / или разработки и позволяет отлаживать сценарии локально или удаленно, из среды IDE или консоли. Его функции:
Удаленная и локальная отладка
Явная и неявная активация
Стек вызовов, включая вызовы функций, вызовы динамических и статических методов с их параметрами
Навигация по стеку вызовов с возможностью оценки переменных в соответствующих (вложенных) местах
Шаг в / Выйти / Перейти / Бежать к курсору
Условные точки останова
Глобальные точки останова
Ведение журнала ошибок и предупреждений
Несколько одновременных сеансов для параллельной отладки
Поддержка интерфейсов GUI и CLI
Поддерживаются сети IPv6 и IPv4
Все данные, передаваемые отладчиком, можно дополнительно защитить с помощью SSL.
источник
Нет прямого способа получить использование памяти одной переменной, но, как предложил Гордон, вы можете использовать
memory_get_usage
. Это вернет общий объем выделенной памяти, поэтому вы можете использовать обходной путь и измерить использование до и после, чтобы получить использование одной переменной. Это немного взломано, но должно работать.Обратите внимание, что это никоим образом не является надежным методом, вы не можете быть уверены, что ничто другое не касается памяти при назначении переменной, поэтому его следует использовать только как приближение.
Фактически вы можете превратить это в функцию, создав копию переменной внутри функции и измерив используемую память. Не тестировал, но в принципе не вижу в этом ничего плохого:
источник
$tmp = $var
создаст неглубокую копию. Это не будет выделять больше памяти, пока не будет изменен $ tmp.$tmp = unserialize(serialize($var))
; Это объединит подход Aistina, описанный выше.$var
это уже поверхностная копия или ссылка на то, что было передано в функцию, вам не нужно$tmp
, но вы можете переназначить$var
. Это сохраняет внутреннюю ссылку от$tmp
до$var
.$tmp
от$var
?Нет, нет. Но вы можете
serialize($var)
проверитьstrlen
результат для приблизительности.источник
strlen(serialize(array(1,2,3)))
равен 30.В ответ Тату Ульманенс отвечает:
Следует отметить, что
$start_memory
само будет занимать память (PHP_INT_SIZE * 8
).Итак, вся функция должна стать:
Извините, что добавляю это как дополнительный ответ, но я пока не могу прокомментировать ответ.
Обновление: * 8 не определено. Очевидно, это может зависеть от версии php и, возможно, от 64/32 бит.
источник
* 8
? Спасибо!PHP_INT_SIZE
байты, аPHP_INT_SIZE*8
. Вы можете попробовать, вызвав эту функцию, она должна вернуть 0:function sizeofvar() { $start_memory = memory_get_usage(); return memory_get_usage() - $start_memory - PHP_INT_SIZE*8; }
8
не кажется постоянным. После вашей функции комментариев в моей системе разработки (PHP 5.6.19) он возвращается-16
. Кроме того, что интересно,php -a
вызов двух строк функции дает разные значения.Видеть:
memory_get_usage()
- Возвращает объем памяти, выделенной PHPmemory_get_peak_usage()
- Возвращает пик памяти, выделенной PHPОбратите внимание, что это не даст вам использования памяти конкретной переменной. Но вы можете вызывать эти функции до и после присвоения переменной, а затем сравнивать значения. Это должно дать вам представление об используемой памяти.
Вы также можете взглянуть на расширение PECL Memtrack , хотя документации немного не хватает, если не сказать, практически не существует.
источник
Вы можете выбрать вычисление разницы в памяти для возвращаемого значения обратного вызова. Это более элегантное решение, доступное в PHP 5.3+.
источник
Вы не можете ретроспективно рассчитать точный размер переменной, поскольку две переменные могут совместно использовать одно и то же выделенное пространство в памяти.
Попробуем разделить память между двумя массивами, мы увидим, что выделение второго массива занимает половину памяти первого. Когда мы отключили первый, почти вся память по-прежнему используется вторым.
Таким образом, мы не можем сделать вывод, что второй массив использует половину памяти, так как становится ложным, когда мы сбрасываем первый.
Чтобы получить полное представление о том, как выделяется память в PHP и для чего она используется, я предлагаю вам прочитать следующую статью: Насколько велики на самом деле массивы (и значения) PHP? (Подсказка: БОЛЬШОЙ!)
В разделе « Основы подсчета ссылок» в документации PHP также содержится много информации об использовании памяти и подсчете ссылок на общий сегмент данных.
Представленные здесь различные решения хороши для приближений, но ни одно из них не может справиться с тонким управлением памятью PHP.
Если вам нужно новое выделенное пространство после назначения, вы должны использовать его
memory_get_usage()
до и после выделения, так как использование его с копией дает вам ошибочное представление о реальности.Помните, что если вы хотите сохранить результат первого
memory_get_usage()
, переменная должна уже существовать раньше иmemory_get_usage()
должна вызываться еще раз в предыдущий раз, как и все остальные функции.Если вы хотите эхо, как в приведенном выше примере, ваш выходной буфер должен быть уже открыт, чтобы избежать учета памяти, необходимой для открытия выходного буфера.
Если вы хотите полагаться на функцию для вычисления необходимого пространства для хранения копии переменной, следующий код позаботится о различных оптимизациях:
Обратите внимание, что размер имени переменной имеет значение в выделенной памяти.
Переменная имеет базовый размер, определяемый внутренней структурой C, используемой в исходном коде PHP. В случае цифр этот размер не меняется. Для строк это добавит длину строки.
Если мы не принимаем во внимание инициализацию имени переменной, мы уже знаем, сколько использует переменная (в случае чисел и строк):
(эти числа могут меняться в зависимости от версии PHP)
Вы должны округлить до кратного 4 байта из-за выравнивания памяти. Если переменная находится в глобальном пространстве (не внутри функции), она также выделит еще 64 байта.
Поэтому, если вы хотите использовать один из кодов на этой странице, вы должны проверить, что результат, используя несколько простых тестовых примеров (строки или числа), соответствует этим данным с учетом всех указаний в этом сообщении (массив $ _GLOBAL, первый вызов функции, выходной буфер, ...)
источник
zvalue
,is_ref
а затем скопировать на записи. Спасибо.У меня была аналогичная проблема, и я использовал решение, чтобы записать переменную в файл, а затем запустить для него размер файла (). Примерно так (непроверенный код):
Это решение не очень быстрое, потому что оно включает в себя дисковый ввод-вывод, но оно должно дать вам нечто гораздо более точное, чем уловки memory_get_usage. Это просто зависит от того, какая точность вам нужна.
источник
strlen
будет проще.Никогда не пробовал, но трассировки Xdebug с помощью xdebug.collect_assignment может быть достаточно.
источник
источник
Следующий сценарий показывает общее использование памяти одной переменной.
Проверь это
http://www.phpzag.com/how-much-memory-do-php-variables-use/
источник