0Pricing
PHP Academy · Урок

Управление памятью и советы по производительности

Освобождайте память заранее, избегайте копирования больших массивов и используйте генераторы для больших наборов данных

«Управление памятью и советы по производительности» — бесплатный урок PHP Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.

Управление памятью в PHP

PHP использует подсчёт ссылок и сборщик циклов для очистки памяти. Каждый запрос начинается с новой динамической области памяти, однако в долгоживущих процессах (рабочих процессах, Horizon) могут накапливаться утечки памяти.

memory_limit

Задайте подходящий лимит памяти в php.ini. Его превышение вызывает критическую ошибку.

# php.ini:
memory_limit = 256M

// Check at runtime:
echo memory_get_usage(true)   / 1024 / 1024 . " MB";
echo memory_get_peak_usage(true) / 1024 / 1024 . " MB peak";

Освобождайте большие переменные

Явно освобождайте память, когда большие массивы или объекты больше не нужны внутри долгой функции.

<?php
$data = loadLargeDataset();
processData($data);
unset($data); // free immediately, do not wait for end of scope
gc_collect_cycles(); // force garbage collection if circular references

Генераторы для больших наборов данных

Используйте генераторы для обработки больших файлов или результатов запросов построчно, не загружая всё в память.

<?php
function readCsvLines(string $file): Generator {
    $fh = fopen($file, "r");
    while (($line = fgetcsv($fh)) !== false) {
        yield $line;
    }
    fclose($fh);
}

foreach (readCsvLines("large.csv") as $row) {
    importRow($row);
}

Избегайте копирования больших массивов

PHP использует копирование массивов при записи. Присваивание массива переменной не копирует его, пока один из них не будет изменён. Если требуется изменение, передавайте большие массивы по ссылке.

<?php
function processArray(array &$data): void {
    // & avoids a copy when the parameter is modified
}

Конкатенация строк в циклах

Построение строки конкатенацией в цикле неэффективно для очень больших строк. Используйте массив и implode().

<?php
// Slow for large N:
$str = "";
foreach ($items as $item) $str .= $item->format()."\n";

// Faster:
$parts = [];
foreach ($items as $item) $parts[] = $item->format();
$str = implode("\n", $parts);

Кэширование создания объектов

Создание экземпляров объектов, особенно с логикой конструктора, в тесных циклах обходится дорого. По возможности кэшируйте экземпляры или используйте легковесные объекты.

Избегайте повторных вызовов функций

Выносите вызовы функций с постоянным результатом за пределы циклов, если результат не меняется на каждой итерации.

<?php
// Slow:
for ($i = 0; $i < count($items); $i++) { ... }

// Fast (count() called once):
$n = count($items);
for ($i = 0; $i < $n; $i++) { ... }

Настройка рабочих процессов PHP-FPM

Настраивайте количество рабочих процессов PHP-FPM с учётом доступной памяти и ожидаемого параллелизма. Приблизительное правило: количество рабочих процессов = RAM / (среднее использование памяти одним рабочим процессом).

OPcache и предзагрузка

Включите OPcache, рассмотренный на предыдущем уроке, и предварительно загружайте часто используемые классы фреймворка. Это устраняет накладные расходы на разбор и компиляцию при каждом запросе.

Сначала профилирование

Всегда выполняйте профилирование перед оптимизацией. Микрооптимизации кода, который не является узким местом, отнимают время и ухудшают читаемость. Используйте Xdebug или Blackfire, чтобы найти фактически наиболее нагруженный участок кода.

Итоги

Используйте генераторы для больших наборов данных. Удаляйте переменные после завершения работы с ними. Избегайте копирования больших массивов. Выносите вызовы с постоянным результатом за пределы циклов. Профилируйте код с помощью Xdebug, чтобы найти фактические узкие места перед оптимизацией.

Быстрая проверка

Каково главное преимущество генераторов PHP при работе с большими наборами данных?

Часто задаваемые вопросы

Урок «Управление памятью и советы по производительности» бесплатный?

Да — полный текст урока «Управление памятью и советы по производительности» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.

Чему я научусь в уроке «Управление памятью и советы по производительности»?

Освобождайте память заранее, избегайте копирования больших массивов и используйте генераторы для больших наборов данных Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать PHP Academy?

Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Управление памятью и советы по производительности»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке PHP Academy?

Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Профилирование PHP с Xdebug
  2. OPcache: кэширование байткода
  3. Оптимизация запросов к базе данных
  4. Управление памятью и советы по производительности
← Назад к PHP Academy