Построчное чтение файла в PHP: выбор подходящего инструмента

Раздел: Ввод-вывод в PHP -> Работа с файлами

Чтение строки из файла: обзор методов

Как эффективно прочитать одну строку из файла без загрузки всего содержимого в память?

Основной и наиболее рекомендуемый способ - использование функции fgets(). Она читает файл построчно, не загружая его целиком, что особенно важно при работе с большими файлами.

Пример:

$handle = fopen('file.txt', 'r');
if ($handle) {
    $line = fgets($handle);
    echo $line;
    fclose($handle);
}

Include system php (включение системного файла)

Пояснение: файл открывается в режиме чтения ('r'), указатель устанавливается в начало. fgets() возвращает одну строку (до символа новой строки) или false, если достигнут конец файла. После чтения файл закрывается. Если нужно прочитать несколько строк, цикл: while (($line = fgets($handle)) !== false) { ... }.

Типичная ошибка: забыть проверить успешность открытия файла. Если файл не существует или нет прав, fopen() вернет false и последующие вызовы приведут к ошибке. Решение: всегда проверять if ($handle).

Проблема с кодировкой: fgets() не обрабатывает многобайтовые кодировки. Для UTF-8 может прочитать некорректные символы, если в строке есть BOM. Решение: использовать fread() с предварительным определением кодировки или функцию fgets() из расширения mb_string (например, mb_convert_encoding после чтения).

Как быстро получить все строки файла в виде массива?

Функция file() читает весь файл в массив, каждая строка - отдельный элемент. Удобно, когда файл небольшой (до нескольких мегабайт).

$lines = file('file.txt');
foreach ($lines as $line) {
    echo $line;
}

Ru reading php line (чтение строки из файла php)

Недостаток: загружает весь файл в память. Для больших файлов может вызвать ошибку out of memory. Решение: использовать ограничение размера файла (например, через filesize()) или выбрать fgets(). Также по умолчанию сохраняет символ новой строки. Можно удалить через второй параметр FILE_IGNORE_NEW_LINES.

Как прочитать строку как единую строку и разбить на части?

Функция file_get_contents() читает весь файл в строку, затем её можно разделить с помощью explode() по символу перевода строки. Подходит, когда нужен доступ ко всему содержимому сразу.

$content = file_get_contents('file.txt');
$lines = explode("\n", $content);
foreach ($lines as $line) {
    echo $line;
}

Php file get html (получение html файла через php)

Ошибка: разбиение по \n может не учесть разные окончания строк (Windows - \r\n, Mac - \r). Решение: использовать preg_split() с регулярным выражением /\R/ или file() с флагами.

Проблема с памятью: как и file(), требует загрузки всего файла в память. Неприменимо для гигабайтных файлов.

Как читать строки из файла объектно-ориентированно?

Класс SplFileObject (из SPL) предоставляет удобный итератор для построчного чтения. Работает как с локальными, так и с удаленными файлами, экономит память, поддерживает фильтры.

$file = new SplFileObject('file.txt');
while (!$file->eof()) {
    $line = $file->fgets();
    echo $line;
}

Нюанс: свойство eof() может возвращать true до фактического конца, если последняя строка не содержит символ новой строки. Решение: проверять результат fgets() на false.

Производительность: SplFileObject чуть медленнее fgets(), но предоставляет дополнительные возможности (регулярные выражения, конвертация кодировок через getChildren()).

- Edit home php (редактирование файла home.php)
- Php количество файлов (подсчет количества файлов в папке в php)
- Archive php file (php: работа с архивными файлами (zip, tar))

Расширенные примеры построчного чтения файлов

Чтение CSV-файла с помощью fgets и str_getcsv

Пример обработки CSV, где каждая строка - запись с разделителями запятая:

Пример
$handle = fopen('data.csv', 'r');
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        // Убираем символ новой строки
        $line = trim($line);
        // Разбираем CSV
        $fields = str_getcsv($line);
        print_r($fields);
    }
    fclose($handle);
}
Array ( [0] => Иван [1] => Иванов [2] => 30 )
Array ( [0] => Мария [1] => Петрова [2] => 25 )

Чтение больших файлов с прогрессом

Имитация чтения лог-файла размером 1 ГБ с использованием fgets:

Пример
$file = fopen('large.log', 'r');
if ($file) {
    $linesRead = 0;
    while (($line = fgets($file)) !== false) {
        // Обработка строки
        $linesRead++;
        if ($linesRead % 100000 == 0) {
            echo "Прочитано $linesRead строк\n";
        }
    }
    fclose($file);
}
// Вывод: Прочитано 100000 строк ...

Использование SplFileObject с фильтром строк

Чтение только строк, содержащих слово "ERROR":

Пример
$file = new SplFileObject('log.txt');
while (!$file->eof()) {
    $line = $file->fgets();
    if ($line === false) break;
    if (strpos($line, 'ERROR') !== false) {
        echo $line;
    }
}

Чтение строки из удаленного файла (curl + fgets)

Построчное чтение удаленного текстового файла через поток:

Пример
$url = 'https://example.com/remote.txt';
$context = stream_context_create(['http' => ['header' => 'Accept-Encoding: gzip']]);
$handle = fopen($url, 'r', false, $context);
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        echo htmlspecialchars($line);
    }
    fclose($handle);
} else {
    echo "Не удалось открыть URL";
}

Обработка файла с окончаниями строк Windows (\r\n)

Использование флагов в file() для игнорирования различий:

Пример
$lines = file('mixed_endings.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
    echo "$line\n";
}

Чтение строк с использованием итератора SPL

Применение SplFileObject как итератора в цикле foreach:

Пример
$file = new SplFileObject('data.txt');
$file->setFlags(SplFileObject::DROP_NEW_LINE | SplFileObject::SKIP_EMPTY);
foreach ($file as $line) {
    echo $line;
}

Чтение строки из файла PHP - comments

En
Ru reading php line (php)