Fgets: примеры (PHP)

Работа с функцией fgets для чтения файлов в PHP
Раздел: Работа с файлами
fgets(resource $stream, ?int $length = null): string|false

Описание функции fgets

fgets — это встроенная функция PHP для построчного чтения данных из файла. Она часто применяется при обработке текстовых файлов, логов, CSV-данных и других структурированных текстовых форматов, где требуется последовательное чтение.

Аргументы функции
  • $stream (обязательный) — ресурс (дескриптор) файла, полученный с помощью функции fopen().
  • $length (необязательный) — максимальное количество байт для чтения. Если параметр не указан, функция будет читать строку до тех пор, пока не достигнет конца строки или файла.

Функция возвращает прочитанную строку или false в случае ошибки или достижения конца файла (EOF).

Базовые примеры использования

Чтение файла построчно
$handle = fopen('example.txt', 'r');
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        echo $line;
    }
    fclose($handle);
}
Содержимое первой строки файла
Содержимое второй строки файла
Чтение с ограничением длины
$handle = fopen('example.txt', 'r');
$line = fgets($handle, 10);
echo $line;
fclose($handle);
Содержимое (первые 10 байт)

Похожие функции в PHP

Устаревшая функция, аналогичная fgets, но удаляющая HTML- и PHP-теги из строки. В PHP 7.3 помечена как устаревшая, в PHP 8.0 удалена.

Читает строку из файла и парсит её как CSV-данные, возвращая массив полей. Предпочтительнее использовать для работы с CSV-файлами.

Читает весь файл в массив, где каждый элемент представляет строку. Используется для небольших файлов, когда нужно получить все строки сразу.

Аналоги в других языках

Fgets в Python

with open('example.txt', 'r') as file:
    line = file.readline()
    print(line)
Содержимое первой строки файла
JavaScript (Node.js)
const fs = require('fs');
const readline = require('readline');
const stream = fs.createReadStream('example.txt');
const rl = readline.createInterface({ input: stream });
rl.on('line', (line) => {
    console.log(line);
});

Fgets в MySQL

Для чтения файлов в MySQL используется команда LOAD DATA INFILE, которая загружает содержимое файла в таблицу.

LOAD DATA INFILE 'data.txt' INTO TABLE table_name;

Типичные ошибки

Отсутствие проверки на false
$handle = fopen('missing.txt', 'r');
$line = fgets($handle); // Предупреждение, если файл не существует
echo $line;
Warning: fopen(missing.txt): Failed to open stream: No such file or directory
Использование закрытого дескриптора
$handle = fopen('example.txt', 'r');
fclose($handle);
$line = fgets($handle); // Предупреждение
Warning: fgets(): supplied resource is not a valid stream resource
Забытая итерация в цикле
$handle = fopen('example.txt', 'r');
while (!feof($handle)) {
    $line = fgets($handle);
    echo $line;
    // Отсутствие fgets для продвижения указателя
}
Бесконечный цикл

Изменения в последних версиях PHP

В PHP 8.1.0 функция fgets теперь возвращает null при передаче нересурсного аргумента. Ранее выдавалось предупреждение и возвращалось false.

$result = fgets(null);
var_dump($result);
PHP 8.0: Warning: fgets() expects parameter 1 to be resource, null given
bool(false)

PHP 8.1: null

Расширенные примеры

Обработка больших файлов с фильтрацией
Пример php
$handle = fopen('large.log', 'r');
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        if (str_contains($line, 'ERROR')) {
            echo $line;
        }
    }
    fclose($handle);
}
Чтение с конкретной позиции
Пример php
$handle = fopen('data.txt', 'r');
fseek($handle, 100); // Перемещаем указатель на 100 байт
$line = fgets($handle);
echo $line;
fclose($handle);
Парсинг логов с разбором строк
Пример php
$handle = fopen('access.log', 'r');
while (($line = fgets($handle)) !== false) {
    $parts = explode(' ', $line);
    if (count($parts) > 6) {
        echo 'IP: ' . $parts[0] . ', Дата: ' . $parts[3] . '\n';
    }
}
fclose($handle);
Чтение бинарных файлов с ограничением
Пример php
$handle = fopen('image.jpg', 'rb');
$header = fgets($handle, 20); // Чтение первых 20 байт
echo bin2hex($header);
fclose($handle);
ffd8ffe000104a464946

PHP fgets function comments

En
Fgets Gets line from file pointer