W3docs

Открытие файлов в PHP: руководство по чтению и записи файлов

Узнайте, как открывать, читать, записывать и закрывать файлы в PHP с помощью fopen(), fread(), fwrite() и других функций.

Чтение и запись файлов — одна из наиболее распространённых задач в серверном программировании: вы сохраняете загруженные документы, генерируете логи, кэшируете данные и читаете конфигурационные файлы. PHP предоставляет небольшой и стабильный набор функций для этого, и все они начинаются с одного вызова — fopen(). В этой главе объясняется, как открыть файл, прочитать его, записать в него данные, добавить данные в конец, закрыть файл и обработать ошибки, которые неизбежно возникнут в процессе работы.

Функция fopen()

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

$handle = fopen("example.txt", "r");

Если файл не удаётся открыть, fopen() возвращает false и выдаёт предупреждение, поэтому перед использованием дескриптора всегда следует проверять возвращаемое значение.

Режимы открытия файла

Режим — это наиболее важный аргумент: он управляет тем, будет ли файл прочитан, перезаписан или дополнен, а также будет ли создан файл, если он отсутствует.

РежимЧтениеЗаписьУказатель начинается сОбрезает файл?Создаёт, если не существует?
rданетначаланетнет (ошибка)
r+даданачаланетнет (ошибка)
wнетданачаладада
w+даданачаладада
aнетдаконцанетда
a+дадаконцанетда
xнетданачалан/дда (ошибка, если существует)
x+даданачалан/дда (ошибка, если существует)

Несколько правил, которые стоит запомнить:

  • Используйте r, когда файл должен существовать заранее и вам нужно только читать его.
  • w и w+ стирают содержимое файла в момент открытия — никогда не используйте их, когда хотите сохранить существующие данные.
  • a и a+ — безопасный выбор для логов: они всегда пишут в конец файла и никогда не обрезают его.
  • x и x+ защищают от случайной перезаписи существующего файла, что полезно для операций «создать один раз».

Примечание: в Windows добавьте b к режиму (например, rb, wb, ab), чтобы открыть файл в бинарном режиме и предотвратить трансляцию переносов строк, которая может повредить нетекстовые файлы. В Linux и macOS флаг b безвреден, поэтому его добавление везде делает код переносимым.

Чтение файлов в PHP

Чтобы прочитать файл, откройте его в режиме чтения (r) и используйте fread(). fread() принимает дескриптор файла и количество байт для чтения; в паре с filesize() это позволяет прочитать весь файл за один раз.

Вот пример, который читает всё содержимое файла:

<?php
$file = fopen("example.txt", "r");
if ($file) {
    $contents = fread($file, filesize("example.txt"));
    fclose($file);
    echo $contents;
}
?>

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

Для больших файлов загрузка всего содержимого в память нерациональна. Используйте fgets() для чтения по одной строке за раз и feof() («конец файла»), чтобы остановиться при достижении конца:

<?php
$file = fopen("example.txt", "r");
if ($file) {
    while (!feof($file)) {
        $line = fgets($file);
        echo $line;
    }
    fclose($file);
}
?>

Более короткая альтернатива: file_get_contents()

Для простого чтения, когда нужно просто получить весь файл в виде строки, file_get_contents() выполняет открытие, чтение и закрытие в одном вызове:

<?php
$contents = file_get_contents("example.txt");
echo $contents;
?>

Используйте fopen() + fread()/fgets(), когда вам нужен тонкий контроль (потоковая передача, частичное чтение, блокировка); прибегайте к file_get_contents(), когда просто нужен текст файла.

Запись файлов в PHP

Чтобы записать данные в файл, откройте его в режиме записи (w) и используйте fwrite(). fwrite() принимает дескриптор файла и строку для записи и возвращает количество записанных байт (или false в случае ошибки). Помните, что w сначала обрезает файл, поэтому запись всегда начинается с пустого файла.

Вот пример, который записывает данные в файл:

<?php
$file = fopen("example.txt", "w");
if ($file) {
    fwrite($file, "This is some data.");
    fclose($file);
}
?>

Как и при чтении, для записи существует однострочный аналог: file_put_contents() открывает, записывает и закрывает файл в одной инструкции.

Добавление данных в файл в PHP

Чтобы добавить данные в файл в PHP, можно использовать функцию fopen() в режиме добавления (a) и функцию fwrite(). Это позволяет дописывать данные в конец файла, а не перезаписывать его.

Вот пример, который добавляет данные в файл:

<?php
$file = fopen("example.txt", "a");
if ($file) {
    fwrite($file, "This is some additional data.");
    fclose($file);
}
?>

Закрытие файлов в PHP

После завершения работы с файлом важно его закрыть, чтобы освободить системные ресурсы и предотвратить повреждение данных. Это делается с помощью функции fclose(), которая принимает указатель на файл, возвращённый функцией fopen().

Вот пример, демонстрирующий правильный способ закрытия файла в PHP:

<?php
$file = fopen("example.txt", "r");
if ($file) {
    // Perform file operations here
    fclose($file);
    echo "File closed successfully.";
}
?>

Обработка ошибок в PHP

При работе с файлами в PHP важно правильно обрабатывать ошибки. Например, если попытаться открыть файл, который не существует, или записать данные в файл, недоступный для записи, возникнет ошибка.

Для обработки ошибок можно использовать инструкцию if и переменную $file, возвращаемую функцией fopen(). Если fopen() возвращает false, это означает, что произошла ошибка. В производственных средах можно использовать оператор подавления ошибок @ или настроить пользовательский обработчик ошибок для корректной обработки предупреждений без нарушения макета страницы.

Вот пример, демонстрирующий обработку ошибок в PHP:

<?php
$file = fopen("example.txt", "r");
if ($file) {
    $contents = fread($file, filesize("example.txt"));
    fclose($file);
    echo $contents;
} else {
    echo "Error: Unable to open file.";
}
?>

Итоги

fopen() — основа работы с файлами в PHP. Выбранный режим определяет всё: r читает, w перезаписывает, a добавляет данные, а x создаёт файл только если он ещё не существует. Читайте с помощью fread()/fgets(), записывайте с помощью fwrite(), всегда проверяйте корректность дескриптора и закрывайте файл с помощью fclose() по завершении работы. Для простых разовых операций чтения и записи предпочтительны file_get_contents() и file_put_contents().

Для более глубокого изучения смотрите fopen(), fread() и fwrite(), а также разделы PHP File Handling и PHP Filesystem.

Практика

Практика
Какие функции в PHP используются для открытия или чтения файла?
Какие функции в PHP используются для открытия или чтения файла?
Was this page helpful?