Обработка больших файлов в PHP с помощью генераторов
Представим, что нам необходимо разобрать большой файл с логами либо еще с какими-то данными.Как правило, при работе с большими файлами самой главной проблемой становится объем памяти потребляемый скриптом. Особенно это актуально на виртуальных хостингах, где объем выделяемой памяти, как правило ограничен.
Вот здесь то, нам и помогут PHP генераторы. О генераторах в PHP я уже рассказывал здесь. Их преимущество состоит в том, что для обработки даже очень больших файлов не требуется огромное количество памяти, а вполне достаточно то, что предоставляется дефолтной конфигурацией.
Итак, вот пример скрипта, который читает большой csv файл логов (допустим) и выполняет над ним какие-то операции:
<?php
// файл открывется на чтение
// если файл невозможно открыть, то бросается исключение
function getRows($file) {
$handle = fopen($file, 'rb');
if (!$handle) {
throw new Exception();
}
// пока не достигнем конца файла
while (!feof($handle)) {
// читаем строку
// и генерируем значение
yield fgetcsv($handle);
}
// закрываем
fclose($handle);
}
// проходимся по всему файлу
// и выводим на печать
foreach (getRows('DATA_LOG.csv') as $row) {
print_r($row);
}
В чем здесь преимущество спросите Вы? А вот, в чем. При вызове в цикле foreach функции-генератора getRows
не происходит чтение всего файла целиком, а происходит чтение одной строки из файла DATA_LOG.csv. Тем самым экономится память.
При каждом следующем выводе, эта функция будет выводить последующую порцию данных.
Таким образом, с введением генераторов в PHP у разработчиков появился мощный инструмент, который позволяет писать быстрые и экономные программы.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.