Введение: зачем PHP умеет работать с файлами?
Любой веб-проект рано или поздно сталкивается с необходимостью сохранять данные на сервере. Будь то загрузка аватара пользователя, создание логов ошибок или генерация отчётов — всё это требует умения управлять файлами и папками. PHP предоставляет мощный набор функций для работы с файловой системой, и освоить их не так сложно, как кажется.
В этой статье мы разберём основные операции: создание, чтение, запись, удаление файлов и директорий, а также проверку прав доступа. Все примеры написаны на чистом PHP и готовы к использованию в ваших проектах.
1. Основы: открытие, чтение и запись файлов
Прежде чем что-то делать с файлом, его нужно открыть. Для этого в PHP используется функция fopen(). Она возвращает ресурс (указатель на файл), с которым затем можно работать.
Режимы открытия файлов
Второй параметр fopen() — режим доступа. Вот самые популярные:
'r'— только чтение, указатель в начале файла.'w'— запись (создаёт файл или очищает существующий).'a'— добавление в конец файла (создаёт, если нет).'x'— создание и запись; если файл уже существует — ошибка.
Пример: запись текста в файл
<?php
$filename = 'test.txt';
$file = fopen($filename, 'w') or die('Не удалось открыть файл');
$text = "Привет, мир!\n";
fwrite($file, $text);
fclose($file);
echo 'Файл успешно записан';
?>
После записи обязательно закрывайте файл функцией fclose() — это освобождает системные ресурсы.
Чтение файла построчно
<?php
$file = fopen('test.txt', 'r');
while (!feof($file)) {
$line = fgets($file);
echo $line . '<br>';
}
fclose($file);
?>
Функция feof() проверяет, достигнут ли конец файла. fgets() читает одну строку.
Более простые альтернативы
Для быстрых операций PHP предлагает функции-обёртки:
file_get_contents($filename)— читает весь файл в строку.file_put_contents($filename, $data)— записывает строку в файл (создаёт или перезаписывает).
<?php
// Чтение
$content = file_get_contents('test.txt');
echo $content;
// Запись
file_put_contents('new.txt', 'Простая запись');
?>
2. Управление директориями: создание, удаление, навигация
Работа с папками в PHP почти так же проста, как с файлами. Главные функции — mkdir(), rmdir() и scandir().
Создание папки
<?php
$dir = 'uploads';
if (!is_dir($dir)) {
mkdir($dir, 0777, true);
echo 'Папка создана';
} else {
echo 'Папка уже существует';
}
?>
Параметр 0777 — права доступа (маска). Третий аргумент true позволяет создать вложенные директории рекурсивно (например, images/2024/).
Удаление папки
Функция rmdir() удаляет только пустую директорию. Если внутри есть файлы, нужно сначала очистить её:
<?php
function removeDir($dir) {
if (!is_dir($dir)) return;
$items = scandir($dir);
foreach ($items as $item) {
if ($item == '.' || $item == '..') continue;
$path = $dir . '/' . $item;
if (is_dir($path)) {
removeDir($path);
} else {
unlink($path);
}
}
rmdir($dir);
}
removeDir('temp');
echo 'Папка удалена';
?>
Получение списка файлов в папке
<?php
$files = scandir('uploads');
foreach ($files as $file) {
if ($file != '.' && $file != '..') {
echo $file . '<br>';
}
}
?>
3. Проверка прав доступа и метаданных
Перед работой с файлом полезно убедиться, что он существует и доступен для чтения/записи. Для этого используйте:
file_exists($path)— проверяет, существует ли файл или папка.is_readable($path)— можно ли читать.is_writable($path)— можно ли писать.filesize($path)— размер файла в байтах.filemtime($path)— время последней модификации (Unix timestamp).
Пример: безопасная запись с проверкой
<?php
$file = 'config.php';
if (file_exists($file) && is_writable($file)) {
file_put_contents($file, '<?php return [];');
echo 'Файл обновлён';
} else {
echo 'Невозможно записать файл';
}
?>
Изменение прав доступа (chmod)
Иногда нужно явно установить права на файл или папку:
<?php
chmod('uploads', 0755); // Владелец: всё, остальные: чтение+выполнение
chmod('private.txt', 0600); // Только владелец
?>
Помните: права задаются в восьмеричной системе (с ведущим нулём).
4. Удаление и переименование файлов
Для удаления одного файла служит функция unlink(). Переименование или перемещение — rename().
Удаление файла
<?php
$file = 'old.txt';
if (file_exists($file)) {
unlink($file);
echo 'Файл удалён';
} else {