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

Использование PHP функции readfile: чтение и вывод файлов
Раздел: Работа с файлами
readfile(string $filename, bool $use_include_path = false, ?resource $context = null): int|false

Функция readfile в PHP предназначена для чтения файла и вывода его содержимого напрямую в буфер вывода.

Назначение и принцип работы

Основная задача функции - эффективная передача содержимого файла (например, изображения, PDF-документа или CSS-файла) клиенту без необходимости загружать файл полностью в память скрипта. Эта функция часто используется для раздачи статических файлов с применением HTTP-заголовков.

Аргументы функции
  • filename (string, обязательный): Путь к читаемому файлу.
  • use_include_path (bool, необязательный, по умолчанию false): Если установлен в true, функция также ищет файл в include_path.
  • context (resource, необязательный): Ресурс контекста потока, созданный с помощью функции stream_context_create().

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

Простые примеры использования
Базовое чтение текстового файла

Код:

<?php
// Выводит содержимое файла в браузер
$bytes = readfile('document.txt');
echo "\nПрочитано байт: $bytes";
?>

Результат (зависит от содержимого document.txt):

Содержимое текстового файла.
Прочитано байт: 25
Использование include_path

Код:

<?php
// Поиск файла в директориях include_path
set_include_path('/www/files/');
$bytes = readfile('data.txt', true);
echo "Прочитано: $bytes байт";
?>
Похожие функции в PHP

В PHP существует несколько альтернатив для чтения файлов, каждая со своей спецификой.

Читает весь файл в строку. Предпочтительнее, когда нужно обработать содержимое файла в скрипте, а не отправить его напрямую клиенту.

fopen/fread/fclose

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

highlight_file

Выводит файл с подсветкой синтаксиса. Применяется для демонстрации исходного кода.

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

Readfile в Python

Для аналогичного поведения в Python используется отправка файла через веб-фреймворк или комбинация open() и вывода.

with open('document.txt', 'r') as f:
    print(f.read())
JavaScript (Node.js)

В Node.js для чтения и вывода файла используется модуль fs вместе с потоком ответа.

const fs = require('fs');
const http = require('http');
http.createServer((req, res) => {
    fs.readFile('file.txt', (err, data) => {
        res.end(data);
    });
}).listen(8080);

Readfile в MySQL

Прямого аналога нет, но для чтения файла в таблицу можно использовать LOAD_FILE().

Распространенные ошибки
Файл не найден

Код:

<?php
$result = readfile('несуществующий_файл.txt');
if ($result === false) {
    echo "Ошибка при чтении файла.";
}
?>

Результат:

Warning: readfile(несуществующий_файл.txt): Failed to open stream: No such file or directory in ...
Ошибка при чтении файла.
Вывод после отправки заголовков

Попытка отправить файл после вывода обычного текста или HTML приведет к ошибке или некорректной работе.

Изменения в новых версиях PHP

В PHP 8.0 функция readfile была сделана более строгой в отношении типов аргументов. Передача аргументов неверного типа теперь вызывает TypeError. В версии 7.4 были улучшены производительность и обработка ошибок при работе с потоками.

Расширенные примеры применения
Скачивание файла с HTTP-заголовками

Код для принудительной загрузки файла браузером:

Пример php
<?php
$file = 'archive.zip';
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="' . basename($file) . '"');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}
?>
Использование контекста потока

Чтение защищенного файла через HTTP-авторизацию:

Пример php
<?php
$opts = [
    'http' => [
        'method' => 'GET',
        'header' => "Authorization: Basic " . base64_encode("user:pass")
    ]
];
$context = stream_context_create($opts);
readfile('http://example.com/protected/data.csv', false, $context);
?>
Чтение и вывод изображения

Прямая передача изображения в браузер:

Пример php
<?php
header('Content-Type: image/jpeg');
readfile('photo.jpg');
?>

PHP readfile function comments

En
Readfile Outputs a file