Построчное чтение файла в 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()).
Расширенные примеры построчного чтения файлов
Чтение 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;
}