Открытие файлов в 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.