Самоучитель: PHP 8.5: инженерный практикум
Глава 7 из 22II. Мастерская данных90 минут

Глава 7. Итерации, генераторы и ограниченная память

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

После главы вы сможете
  • обосновать завершение цикла
  • применить iterable
  • прочитать большой набор лениво

Цикл — доказательство прогресса

У while должен существовать изменяемый показатель, приближающий завершение. У foreach источник ограничивает число шагов, но тело всё равно может удерживать растущий массив и исчерпать память. Запишите, что меняется на каждой итерации и какое состояние переносится дальше.

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

Поток элементов

Ленивая обработка журналаВ памяти остаётся текущая запись и ограниченный пакет, а не весь импорт.ИсточникCSVYieldrowValidateDTOBatch100Persistcommit
В памяти остаётся текущая запись и ограниченный пакет, а не весь импорт.

Iterable расширяет выбор реализации

Параметр iterable принимает массив и Traversable. Функция обработки не обязана знать, поступили элементы из памяти, генератора или курсора. Возвращать iterable удобно, если потребителю не нужны count, случайный доступ и повторный проход.

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

Ленивая последовательность

<?php
declare(strict_types=1);

function repetitionRange(int $from, int $to): iterable
{
    if ($from > $to) {
        return;
    }

    for ($value = $from; $value <= $to; $value++) {
        yield $value;
    }
}

foreach (repetitionRange(3, 5) as $value) {
    echo $value;
}

Пакет — управляемая граница

Запись каждой строки в отдельной транзакции медленна, а одна транзакция на миллион строк удерживает блокировки и усложняет повтор. Ограниченный batch создаёт компромисс: известное потребление памяти, периодический commit и checkpoint для продолжения.

Не ловите исключение и не продолжайте автоматически. Ошибка схемы должна остановить импорт, а дефект одной пользовательской строки может попасть в отчёт. Классификация отказов важнее самого try/catch.

Лабораторная работа

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

Локальный прогресс

Закрепите материал

Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.

Перелинковка со справочником

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

  • php.nethttps://www.php.net/supported-versions.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.

Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .

Данные этого сервиса

Настройки cookie и локальных данных

Аналитика

Текущий статус: не выбран. До согласия обе аналитические системы не загружаются.

Локальные данные

Удаление затрагивает только ключи PHP-сервиса в этом браузере и требует подтверждения.

Политики

Политика конфиденциальности · Политика использования файлов cookie