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

Использование feof для проверки конца файла в PHP
Раздел: Работа с файлами
feof(resource $stream): bool

Функция feof в PHP

Функция feof проверяет, достигнут ли конец файла при чтении через указатель файлового потока. Она применяется при последовательном чтении файлов, чтобы определить момент завершения данных.

Аргументы функции

Функция принимает единственный обязательный аргумент:

  • $stream (ресурс) — указатель на открытый файловый поток, полученный функцией fopen().

Функция возвращает true, если указатель находится в конце файла или при ошибке, иначе false.

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

Чтение текстового файла построчно

Использование в цикле для чтения всего файла:

$handle = fopen('example.txt', 'r');
if ($handle) {
    while (!feof($handle)) {
        $line = fgets($handle);
        echo $line;
    }
    fclose($handle);
}
Содержимое файла будет выведено построчно.
Чтение файла посимвольно
$handle = fopen('example.txt', 'r');
if ($handle) {
    while (!feof($handle)) {
        $char = fgetc($handle);
        echo $char;
    }
    fclose($handle);
}
Каждый символ файла будет выведен отдельно.
Проверка конца файла после чтения
$handle = fopen('empty.txt', 'r');
fread($handle, 1);
var_dump(feof($handle));
bool(true)

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

В PHP существуют альтернативные способы чтения файлов без явного использования feof().

file() и file_get_contents()

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

SplFileObject

Класс SplFileObject предоставляет объектно-ориентированный интерфейс для работы с файлами. Метод eof() выполняет аналогичную feof() роль, но интеграция с итераторами делает код более читаемым.

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

Feof в Python

В Python функция read() возвращает пустую строку при достижении конца файла, что можно использовать как условие остановки.

with open('example.txt', 'r') as file:
    while True:
        chunk = file.read(1024)
        if not chunk:
            break
        print(chunk)
Файл читается блоками по 1024 байта.
JavaScript (Node.js)

В Node.js чтение файлов асинхронное, и конец файла определяется по событию 'end' в потоке.

const fs = require('fs');
const stream = fs.createReadStream('example.txt');
stream.on('data', chunk => console.log(chunk));
stream.on('end', () => console.log('Файл прочитан.'));
Данные выводятся по мере чтения, в конце - сообщение.

Feof в MySQL

В SQL нет прямой аналогии, но при обработке результатов запроса курсоры могут использовать условие завершения, например, NOT FOUND в процедурах.

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

Неправильная проверка в цикле

Использование feof() перед чтением может привести к лишней итерации.

$handle = fopen('example.txt', 'r');
while (!feof($handle)) {
    $line = fgets($handle);
    echo $line;
}
// Если файл пуст, цикл не выполнится, что корректно.
// Однако если последняя строка не заканчивается переводом, может возникнуть дублирование.
Вывод зависит от структуры файла.
Использование закрытого потока
$handle = fopen('example.txt', 'r');
fclose($handle);
var_dump(feof($handle));
Warning: feof() expects parameter 1 to be resource, bool given
bool(false)
Передача некорректного ресурса
$handle = false;
var_dump(feof($handle));
Warning: feof() expects parameter 1 to be resource, bool given
bool(false)

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

В PHP 8 функция feof() была ужесточена по типизации. Передача аргументов некорректного типа теперь вызывает ошибку TypeError. В предыдущих версиях такое использование приводило к предупреждениям и возврату false.

Пример изменения поведения
// PHP 7
$result = feof(null); // Warning и возврат false
// PHP 8
$result = feof(null); // TypeError
Теперь ошибка типа прерывает выполнение скрипта.

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

Чтение бинарного файла с проверкой

Чтение файла блоками с обработкой возможных ошибок.

Пример php
$handle = @fopen('image.jpg', 'rb');
if (!$handle) {
    die('Не удалось открыть файл');
}

$blockSize = 4096;
while (!feof($handle)) {
    $buffer = fread($handle, $blockSize);
    if ($buffer === false) {
        break;
    }
    // Обработка данных
    echo 'Прочитано ' . strlen($buffer) . ' байт' . PHP_EOL;
}

fclose($handle);
Выводится информация о количестве прочитанных байт в каждом блоке.
Обработка нескольких файлов

Использование feof() для одновременного чтения нескольких потоков.

Пример php
$files = ['file1.txt', 'file2.txt'];
$handles = [];

foreach ($files as $file) {
    $handles[] = fopen($file, 'r');
}

$allFinished = false;
while (!$allFinished) {
    $allFinished = true;
    foreach ($handles as $index => $handle) {
        if (!feof($handle)) {
            $allFinished = false;
            echo fgets($handle);
        }
    }
}

foreach ($handles as $handle) {
    fclose($handle);
}
Строки из файлов выводятся поочередно, пока все файлы не будут прочитаны.
Интеграция с потоковыми контекстами

Использование feof() при чтении данных из сетевого ресурса.

Пример php
$context = stream_context_create(['http' => ['timeout' => 10]]);
$handle = fopen('http://example.com/data.txt', 'r', false, $context);

if ($handle) {
    $content = '';
    while (!feof($handle)) {
        $content .= fread($handle, 8192);
    }
    fclose($handle);
    echo 'Получено данных: ' . strlen($content) . ' байт';
}
Данные считываются с веб-ресурса и подсчитывается их размер.

PHP feof function comments

En
Feof Tests for end-of-file on a file pointer