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(): три шага
- Откройте файл с помощью
fopen()в режиме чтения, например"r". - Читайте строку за строкой с помощью
fgets(). - Закройте дескриптор с помощью
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.