Ответ
Основной принцип — потоковая обработка (streaming), чтобы не загружать файл целиком в оперативную память. Конкретные инструменты зависят от формата файла.
Для текстовых файлов (логи, CSV):
$handle = fopen('huge_file.csv', 'r');
if ($handle) {
while (($line = fgets($handle)) !== false) {
// Обрабатываем каждую строку отдельно
processLine($line);
}
fclose($handle); // Важно освободить ресурс
}
// Для CSV можно использовать fgetcsv($handle)
Для XML: Использую XMLReader, который считывает документ как поток узлов.
$reader = new XMLReader();
$reader->open('large_data.xml');
while ($reader->read()) {
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name === 'item') {
// Обрабатываем только нужные элементы
$data = $reader->expand()->textContent;
processItem($data);
}
}
$reader->close();
Для JSON: Если это NDJSON (Newline Delimited JSON), читаю построчно. Для больших монолитных JSON файлов ищу специализированные потоковые парсеры, например, JsonStreamingParser.
Ключевые правила:
- Никогда не использовать
file_get_contents()для больших файлов. - Обрабатывать данные порциями (по строке, по узлу, по чанку).
- Всегда явно закрывать файловые дескрипторы или объекты парсеров.