← Назад к вопросам

Что такое утечка памяти?

2.3 Middle🔥 121 комментариев
#PHP Core#Инфраструктура и DevOps

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое утечка памяти?

Утечка памяти — это ситуация, когда программа не освобождает память, выделенную динамически, после её использования. В результате память становится недоступной для повторного использования, что может привести к постепенному росту потребления памяти, замедлению работы приложения и даже к его аварийному завершению при исчерпании доступных ресурсов.

Причины утечек памяти в PHP

Хотя PHP использует механизм сборки мусора (Garbage Collector), утечки всё же возможны, особенно в долгоживущих процессах, таких как PHP-FPM worker'ы или приложения на Swoole/ReactPHP. Вот типичные сценарии:

  1. Циклические ссылки — объекты ссылаются друг на друга, создавая цикл, который не разрывается автоматически, даже если они больше не используются.

    class Node {
        public $next;
    }
    
    $a = new Node();
    $b = new Node();
    $a->next = $b;
    $b->next = $a; // Циклическая ссылка
    // Даже после unset($a); unset($b); память может не освободиться сразу
    
  2. Глобальные переменные и статические свойства — данные, хранящиеся в них, сохраняются на протяжении всего выполнения скрипта или даже между запросами (например, в кеше).

    class Registry {
        private static $data = [];
        
        public static function set($key, $value) {
            self::$data[$key] = $value;
        }
    }
    // Если не очищать self::$data, память будет накапливаться
    
  3. Неосвобождаемые ресурсы — открытые файлы, соединения с БД, сокеты, которые не закрываются явно.

    $file = fopen('large.log', 'r');
    // Если не вызвать fclose($file), ресурс останется в памяти
    
  4. Кеширование в памяти без ограничений — например, хранение больших массивов данных без механизма инвалидации.

Как обнаружить утечки в PHP?

Инструменты мониторинга:

  • Xdebug с функцией трассировки памяти (xdebug.memory_profile).
  • PHP Meminfo — расширение для анализа использования памяти.
  • Встроенные функции PHP: memory_get_usage() и memory_get_peak_usage().

Пример отслеживания потребления памяти:

$startMemory = memory_get_usage();
$array = range(1, 100000);
echo 'Память использована: ' . (memory_get_usage() - $startMemory) . " байт\n";

Профилактика и устранение

Лучшие практики:

  • Своевременный unset() для больших переменных и объектов.

  • Использование слабых ссылок (WeakReference) в PHP 7.4+ для избежания циклических ссылок.

    $obj = new stdClass();
    $weakRef = WeakReference::create($obj);
    unset($obj);
    // Объект может быть удалён сборщиком мусора
    
  • Очистка кешей и использование адаптеров с автоматической инвалидацией (Redis, Memcached).

  • Явное закрытие ресурсов (файлов, соединений).

Для долгоживущих процессов:

gc_enable(); // Включение сборщика мусора
// ... логика приложения ...
gc_collect_cycles(); // Принудительный сбор циклических ссылок

Заключение

Утечки памяти в PHP менее критичны, чем в C++, благодаря автоматическому управлению памятью, но они всё же возникают в реальных приложениях. Ключом к их предотвращению является понимание жизненного цикла объектов, регулярное профилирование и использование инструментов мониторинга. Особое внимание стоит уделять долгоживущим процессам, где накопление даже небольших утечек может привести к серьёзным проблемам.