Работа с файловой системой в PHP: основы и практические примеры
Работа с файловой системой — одна из ключевых задач веб-разработки на PHP. Будь то загрузка изображений, запись логов, чтение конфигурационных файлов или управление временными данными — знание функций для работы с файлами и директориями необходимо каждому PHP-разработчику. В этой статье мы подробно разберём основные операции: открытие, чтение, запись, закрытие файлов, а также управление папками и правами доступа.
Основные функции для работы с файлами в PHP
PHP предоставляет богатый набор встроенных функций. Рассмотрим самые важные из них.
Открытие и закрытие файла: fopen() и fclose()
Для начала работы с файлом его нужно открыть с помощью fopen(). Функция принимает два обязательных параметра: путь к файлу и режим открытия. Режим определяет, что вы можете делать с файлом: читать, писать, добавлять данные в конец и т.д.
Основные режимы:
r— только чтение. Указатель в начале файла.r+— чтение и запись. Указатель в начале.w— только запись. Если файл существует, он очищается. Если нет — создаётся.w+— чтение и запись. Очищает файл или создаёт новый.a— только запись в конец файла. Если файла нет — создаётся.a+— чтение и запись в конец.
<?php
$file = fopen("example.txt", "w"); // Открываем файл для записи
if ($file) {
echo "Файл открыт успешно.";
fclose($file); // Всегда закрывайте файл после работы
} else {
echo "Не удалось открыть файл.";
}
?>
Чтение из файла: fgets(), fread() и file_get_contents()
Самый простой способ прочитать весь файл — функция file_get_contents(). Она возвращает содержимое в виде строки.
<?php
$content = file_get_contents("example.txt");
echo $content;
?>
Если нужно читать построчно (например, для больших файлов), используйте fgets() в цикле:
<?php
$file = fopen("example.txt", "r");
while (!feof($file)) {
$line = fgets($file);
echo $line . "<br>";
}
fclose($file);
?>
Функция fread() позволяет прочитать заданное количество байт:
<?php
$file = fopen("example.txt", "r");
$content = fread($file, 100); // Читаем первые 100 байт
echo $content;
fclose($file);
?>
Запись в файл: fwrite() и file_put_contents()
Для записи данных в файл удобно использовать file_put_contents(). Она открывает файл, записывает строку и закрывает его одной командой.
<?php
$data = "Привет, мир!";
file_put_contents("example.txt", $data);
?>
Если нужно добавить данные в конец, используйте флаг FILE_APPEND:
<?php
$data = "Новая строка\n";
file_put_contents("example.txt", $data, FILE_APPEND);
?>
Для более гибкой записи (например, в бинарном режиме) применяется fwrite():
<?php
$file = fopen("example.txt", "w");
fwrite($file, "Строка для записи");
fclose($file);
?>
Работа с директориями в PHP
Помимо файлов, PHP позволяет управлять папками: создавать, удалять, читать их содержимое.
Создание и удаление папок: mkdir() и rmdir()
Функция mkdir() создаёт новую директорию. Вторым параметром можно указать права доступа (по умолчанию 0777).
<?php
if (mkdir("new_folder", 0777)) {
echo "Папка создана.";
} else {
echo "Ошибка создания папки.";
}
?>
Для удаления пустой папки используйте rmdir():
<?php
if (rmdir("new_folder")) {
echo "Папка удалена.";
} else {
echo "Папка не пуста или не существует.";
}
?>
Обратите внимание: rmdir() удаляет только пустые директории. Для удаления папки со всем содержимым нужно написать рекурсивную функцию или использовать готовые библиотеки.
Чтение содержимого папки: scandir()
Функция scandir() возвращает массив с именами всех файлов и подпапок в указанной директории.
<?php
$files = scandir("/var/www/html");
foreach ($files as $file) {
if ($file != "." && $file != "..") {
echo $file . "<br>";
}
}
?>
Для более сложных операций (например, рекурсивного обхода) можно использовать итераторы DirectoryIterator или RecursiveDirectoryIterator.
Проверка существования и прав доступа
Перед работой с файлом или папкой полезно проверить, существует ли объект, и есть ли права на его чтение/запись.
file_exists($path)— проверяет, существует ли файл или директория.is_file($path)— проверяет, является ли объект файлом.is_dir($path)— проверяет, является ли объект директорией.is_readable($path)— можно ли читать файл/папку.is_writable($path)— можно ли записывать данные.
<?php
$path = "example.txt";
if (file_exists($path)) {
if (is_readable($path)) {
echo "Файл существует и доступен для чтения.";
}
}