Ответ
Основной принцип — потоковая обработка (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()для больших файлов. - Обрабатывать данные порциями (по строке, по узлу, по чанку).
- Всегда явно закрывать файловые дескрипторы или объекты парсеров.
Ответ 18+ 🔞
Бля, ну слушай, тут такая тема — как файлы здоровенные обрабатывать, чтобы комп не накрылся медным тазом. Главная фишка — потоковая обработка (streaming), то есть не грузить всю эту пиздохрень в память разом, а по чуть-чуть, как из шланга пить. Инструменты, конечно, зависят от того, что за файл тебе подсунули.
Для текстовых файлов (логи там, CSV всякие):
Вот смотри, тут всё просто, как три копейки. Никакого file_get_contents(), ёпта, это самоубийство. Берёшь fopen и читаешь построчно.
$handle = fopen('huge_file.csv', 'r');
if ($handle) {
while (($line = fgets($handle)) !== false) {
// Обрабатываем каждую строку отдельно
processLine($line);
}
fclose($handle); // Важно освободить ресурс
}
// Для CSV можно использовать fgetcsv($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();
Видишь? Мы не парсим весь лес, а выискиваем только те деревья, которые нам нужны ('item'). Овердохуища экономия.
Для JSON: Тут, чувак, если повезло и у тебя NDJSON (каждая строка — отдельный JSON), то опять же, fgets() и вперёд. А если тебе подсунули один здоровенный JSON-монолит, который весит как чугунный мост, то тут уже надо искать спецпарсеры, типа JsonStreamingParser. Без них — пиши пропало, будет тебе хиросима.
Ключевые правила, которые надо выжечь на жопе:
- НИКОГДА не использовать
file_get_contents()для больших файлов. Это как пытаться выпить море — захлебнёшься. - Обрабатывай всё порциями: строку, узел, чанк. Не жадничай.
- Всегда, блядь, явно закрывай файловые дескрипторы (
fclose) или объекты парсеров (close). А то ресурсы потекут, и терпения у системы будет ноль ебать. Распиздяйство недопустимо.