Генераторы позволяют обрабатывать данные по одному элементу, не загружая все в память:
// Обычный массив - 1 млн элементов в памяти
function getAll(): array {
$data = [];
for ($i = 0; $i < 1_000_000; $i++) {
$data[] = $i;
}
return $data; // ~32 MB
}
// Генератор - 1 элемент в памяти
function getAll(): Generator {
for ($i = 0; $i < 1_000_000; $i++) {
yield $i;
}
}
foreach (getAll() as $item) {
process($item);
}Генераторы идеальны для: чтения больших файлов, результатов из БД, потоковой обработки. Потребление памяти не зависит от объема данных.