W3docs

fgets()

Функция fgets() в PHP читает одну строку из файла. Узнайте синтаксис, возвращаемые значения и правильный цикл чтения.

Функция fgets() читает по одной строке за раз из открытого файлового дескриптора. Это стандартный способ обработки текстовых файлов в PHP без загрузки всего файла в память — что важно, когда файл достаточно велик и чтение его целиком (с помощью file_get_contents() или fread()) было бы расточительным или невозможным.

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

Что такое функция fgets()?

fgets() читает из текущей позиции открытого файлового дескриптора до символа новой строки (\n) включительно и возвращает этот текст как string. Затем указатель файла сдвигается, и следующий вызов читает следующую строку.

Функция не ограничена файлами на диске: подойдёт любой поток, открытый с помощью fopen(), включая php://stdin для чтения ввода с клавиатуры и удалённые URL.

Синтаксис

fgets(resource $stream, ?int $length = null): string|false
  • $stream — указатель на файл, возвращённый fopen() (или другой функцией потока). Он должен быть открыт.
  • $length (необязательный) — читать не более $length - 1 байт. Чтение прекращается при достижении символа новой строки, конца файла или когда прочитано $length - 1 байт — в зависимости от того, что наступит раньше. Опустите параметр, чтобы читать до конца строки вне зависимости от её длины.

Что возвращает fgets()

СитуацияВозвращаемое значение
Строка была прочитанаСтрока как string, с завершающим \n
Достигнут конец файлаfalse
Произошла ошибкаfalse

Поскольку символ новой строки сохраняется, echo воспроизводит переносы строк файла. Если они не нужны, удалите их с помощью rtrim($line, "\r\n").

То, что fgets() возвращает false в конце файла, и обеспечивает работу цикла чтения ниже — вам даже не нужен feof().

Как использовать fgets(): три шага

  1. Откройте файл с помощью fopen() в режиме чтения, например "r".
  2. Читайте строку за строкой с помощью fgets().
  3. Закройте дескриптор с помощью fclose() по завершении.

Рекомендуемый цикл чтения

Наиболее чистый шаблон использует возвращаемое значение false в качестве условия цикла. Присваивание в PHP вычисляется как присвоенное значение, поэтому while (($line = fgets($file)) !== false) читает строку и проверяет её за один шаг:

<?php

$file = fopen("file.txt", "r");

if ($file === false) {
    exit("Could not open the file.\n");
}

while (($line = fgets($file)) !== false) {
    echo $line;          // newline is already part of $line
}

fclose($file);

Строгое сравнение !== false важно: строка, содержащая только "0", является «ложной» в PHP, поэтому простое while ($line = fgets($file)) преждевременно завершится на такой строке. Всегда сравнивайте с !== false.

Чтение строка за строкой с feof()

Также встречается вариант цикла с feof(), который возвращает true после достижения конца файла:

<?php

$file = fopen("file.txt", "r");

while (!feof($file)) {
    $line = fgets($file);
    if ($line === false) {
        break;          // guard against a read failure mid-loop
    }
    echo $line;
}

fclose($file);

Оба варианта корректны. Версия с !== false обычно предпочтительнее, потому что feof() становится true только после неудачного чтения, что при невнимательности может вызвать одну лишнюю пустую итерацию.

Ограничение длины строки

Передайте $length, чтобы ограничить объём читаемых данных длинной строки за раз. Здесь возвращаются только первые 9 байт ($length - 1) каждого фрагмента:

<?php

$file = fopen("file.txt", "r");

// "Hello, world!" is read in pieces of at most 9 bytes
echo fgets($file, 10);   // "Hello, wo"
echo "\n";
echo fgets($file, 10);   // "rld!" (rest of the line)

fclose($file);

Это удобно для защиты от патологически длинных строк, но для обычных текстовых файлов $length можно опустить.

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

Поскольку fgets() работает с любым потоком, это классический способ прочитать строку, введённую пользователем в командной строке:

<?php

echo "What is your name? ";
$name = rtrim(fgets(STDIN), "\r\n");  // strip the Enter key's newline
echo "Hello, $name!\n";

STDIN — предопределённая константа для php://stdin.

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

  • Завершающий символ новой строки включён. Используйте rtrim($line, "\r\n") при сравнении или сохранении значений.
  • Проверяйте через !== false, а не просто по истинности, чтобы строки вроде "0" или "" не завершали цикл досрочно.
  • fgets() требует действительного открытого дескриптора. Если fopen() вернул false (файл отсутствует, неправильные права доступа), передача его в fgets() вызовет предупреждение. Сначала проверьте дескриптор.
  • Не забывайте fclose(). PHP закрывает дескрипторы по завершении скрипта, но явное освобождение — хорошая практика, особенно в длительно работающих скриптах.
  • Для чтения всего файла предпочтите более простые инструменты. Если пословное управление не нужно, file() возвращает файл как array строк, а file_get_contents() — как одну string.

Связанные функции

  • fopen() — открыть файл или поток (обязательно перед fgets()).
  • fread() — читать фиксированное количество байт, а не строк.
  • fgetc() — читать одиночный символ.
  • fgetcsv() — читать строку и разбирать её как CSV.
  • feof() — проверить конец файла.
  • fclose() — закрыть дескриптор.

Заключение

fgets() читает файл по одной строке за раз, возвращая каждую строку (включая символ новой строки) вплоть до конца файла, где возвращает false. Используйте её совместно с fopen() и fclose(), управляйте циклом строгой проверкой !== false и не забывайте применять rtrim() для удаления символа новой строки, когда нужно чистое значение. Для очень больших файлов это обеспечивает стабильное использование памяти, делая fgets() предпочтительным выбором для потокового чтения текста в PHP.

Практика

Практика
Что делает функция fgets() в PHP?
Что делает функция fgets() в PHP?
Was this page helpful?