Memory get usage: примеры (PHP)

Использование memory_get_usage для отслеживания памяти в PHP
Раздел: Информация о PHP
memory_get_usage(bool $real_usage = false): int
Описание функции memory_get_usage

Функция memory_get_usage() возвращает объем памяти в байтах, который выделен для работы текущего скрипта PHP. Она используется для профилирования, отладки и оптимизации кода, помогая находить участки с высоким потреблением памяти.

Аргументы функции
  • $real_usage (bool) — необязательный параметр. По умолчанию false.
    • Если false, функция возвращает память, выделенную системой для скрипта.
    • Если true, возвращается реальный объем памяти, используемый в данный момент. Установка значения true может замедлить выполнение.
Простые примеры использования
Базовый вызов
$memory = memory_get_usage();
echo "Использовано памяти: $memory байт\n";
echo "Использовано памяти: " . round($memory / 1024 / 1024, 2) . " МБ\n";
Использовано памяти: 2097152 байт
Использовано памяти: 2 МБ
С параметром $real_usage
$memory_system = memory_get_usage(false);
$memory_real = memory_get_usage(true);
echo "Системная: $memory_system, Реальная: $memory_real\n";
Системная: 2097152, Реальная: 1835008
Похожие функции в PHP

Функция memory_get_peak_usage() возвращает пиковое значение объема памяти, выделенное для скрипта за время его выполнения. Полезно для анализа максимальных требований.

memory_limit

Директива memory_limit в php.ini задает максимальный объем памяти для скрипта. Функция ini_get('memory_limit') возвращает текущее значение этого лимита.

Выбор функции

memory_get_usage применяют для точечного замера в процессе работы. memory_get_peak_usage используют для общего анализа после выполнения или в его конце.

Аналоги в других языках

Memory get usage в Python

Модуль resource или psutil.

import resource
mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
print(f"Память: {mem} КБ")
Память: 12345 КБ
JavaScript (Node.js)

Используют объект process.memoryUsage().

const mem = process.memoryUsage();
console.log(`RSS: ${mem.rss} байт`);
RSS: 52355072 байт
Отличия

PHP функция возвращает целое число байт для текущего скрипта. В Node.js метод возвращает объект с разными видами памяти. В Python данные часто предоставляются в килобайтах.

Типичные ошибки
Некорректная интерпретация результата
// Ошибка: сравнение без учета типа данных или контекста.
$mem = memory_get_usage();
if ($mem > 100) {
    echo "Памяти много!"; // 100 байт - ничтожно мало.
}
Частые вызовы с $real_usage = true
// В цикле это создает нагрузку.
for ($i = 0; $i < 10000; $i++) {
    $mem = memory_get_usage(true); // Избегают такого в продакшене.
}
Исправленный подход
$memStart = memory_get_usage();
// ... код ...
$memEnd = memory_get_usage();
echo "Разница: " . ($memEnd - $memStart) . " байт\n";
Изменения в версиях PHP

В PHP 8.0 не было значительных изменений для memory_get_usage(). В PHP 5.2 и более ранних версиях поведение могло отличаться в деталях выделения памяти. Начиная с PHP 5.2, параметр $real_usage ведет себя более предсказуемо. В PHP 7 и 8 оптимизации в ядре могли влиять на возвращаемые значения в сторону большей точности.

Расширенные примеры
Отслеживание памяти в цикле
Пример php
echo "Начало: " . memory_get_usage() . "\n";
$data = [];
for ($i = 0; $i < 10000; $i++) {
    $data[] = str_repeat('a', 1000);
    if ($i % 1000 == 0) {
        echo "Шаг $i: " . memory_get_usage() . "\n";
    }
}
unset($data); // Освобождение памяти
echo "После unset: " . memory_get_usage() . "\n";
Начало: 2097152
Шаг 0: 4194304
Шаг 1000: 12320768
...
После unset: 7340032
Сравнение использования памяти разными структурами
Пример php
$mem1 = memory_get_usage();
$array = range(1, 10000);
$mem2 = memory_get_usage();
$splFixedArray = SplFixedArray::fromArray($array);
$mem3 = memory_get_usage();
echo "Обычный массив: " . ($mem2 - $mem1) . "\n";
echo "SplFixedArray: " . ($mem3 - $mem2) . "\n";
Обычный массив: 528384
SplFixedArray: 262144
Использование с профилировкой класса
Пример php
class MemoryTracker {
    private $startMemory;
    public function __construct() {
        $this->startMemory = memory_get_usage();
    }
    public function getUsage() {
        return memory_get_usage() - $this->startMemory;
    }
}
$tracker = new MemoryTracker();
$bigArray = array_fill(0, 5000, 'test');
echo "Потрачено внутри: " . $tracker->getUsage() . " байт\n";
Потрачено внутри: 614400 байт
Мониторинг памяти при работе с файлами
Пример php
$memBefore = memory_get_usage();
$content = file_get_contents('large_file.txt');
$memAfter = memory_get_usage();
echo "Файл загружен в память: " . ($memAfter - $memBefore) . " байт\n";
// Сравнение с размером файла
$fileSize = filesize('large_file.txt');
echo "Размер файла: $fileSize байт\n";

PHP memory_get_usage function comments

En
Memory get usage Returns the amount of memory allocated to PHP