Работа с файловой системой в PHP: основные функции и примеры
Работа с файловой системой — одна из ключевых задач веб-разработки. PHP предоставляет мощный и гибкий набор функций для создания, чтения, записи, удаления файлов и папок, а также для управления правами доступа. В этой статье мы разберём основные возможности PHP для работы с файловой системой, приведём практические примеры и рассмотрим типичные ошибки.
1. Чтение файлов в PHP
PHP поддерживает несколько способов чтения данных из файлов. Выбор метода зависит от размера файла и требуемого уровня контроля.
1.1. Функция file_get_contents()
Самый простой способ прочитать весь файл в строку — использовать file_get_contents(). Эта функция подходит для небольших файлов (конфигурации, шаблоны).
<?php
// Чтение всего файла в строку
$content = file_get_contents('data.txt');
if ($content !== false) {
echo "Содержимое файла: " . htmlspecialchars($content);
} else {
echo "Ошибка чтения файла";
}
?>
1.2. Функция file()
Если нужно получить содержимое файла в виде массива строк (по одной строке на элемент), используйте file().
<?php
$lines = file('log.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $lineNum => $line) {
echo "Строка " . ($lineNum + 1) . ": " . htmlspecialchars($line) . "<br>";
}
?>
1.3. Построчное чтение с fopen() + fgets()
Для больших файлов (например, логов) лучше использовать потоковое чтение, чтобы не держать весь файл в памяти.
<?php
$handle = fopen('large_file.csv', 'r');
if ($handle) {
while (($buffer = fgets($handle, 4096)) !== false) {
echo $buffer . "<br>";
}
fclose($handle);
} else {
echo "Не удалось открыть файл";
}
?>
2. Запись данных в файлы
Запись так же может выполняться разными способами. Основное различие — перезапись файла или добавление в конец.
2.1. Функция file_put_contents()
Быстрый способ записать строку в файл. Если файл не существует, он будет создан. По умолчанию файл перезаписывается.
<?php
$data = "Новая запись: " . date('Y-m-d H:i:s') . "\n";
// Перезапись файла
file_put_contents('log.txt', $data);
// Добавление в конец (флаг FILE_APPEND)
file_put_contents('log.txt', $data, FILE_APPEND);
?>
2.2. Ручная запись через fopen() + fwrite()
Для тонкого контроля (например, блокировки файла) используйте пару fopen() / fwrite().
<?php
$filename = 'counter.txt';
$handle = fopen($filename, 'c+'); // 'c+' — создаёт файл, если его нет
if (flock($handle, LOCK_EX)) { // эксклюзивная блокировка
$current = (int) fread($handle, filesize($filename) ?: 1);
$current++;
ftruncate($handle, 0); // очищаем файл
rewind($handle);
fwrite($handle, $current);
flock($handle, LOCK_UN); // снимаем блокировку
}
fclose($handle);
echo "Счётчик: $current";
?>
3. Работа с директориями
PHP позволяет не только управлять файлами, но и создавать, удалять и просматривать папки.
3.1. Создание папок (mkdir)
<?php
// Создать одну папку
if (!is_dir('uploads')) {
mkdir('uploads', 0755);
}
// Рекурсивное создание вложенных папок (PHP 5.4+)
mkdir('images/2024/12', 0755, true);
?>
3.2. Удаление папок (rmdir)
rmdir() удаляет только пустую папку. Для удаления папки со всем содержимым нужна рекурсивная функция.
<?php
function deleteDirectory($dir) {
if (!file_exists($dir)) {
return true;
}
if (!is_dir($dir)) {
return unlink($dir);
}
$items = array_diff(scandir($dir), ['.', '..']);
foreach ($items as $item) {
deleteDirectory($dir . DIRECTORY_SEPARATOR . $item);
}
return rmdir($dir);
}
// Пример использования
deleteDirectory('temp/cache');
?>
3.3. Просмотр содержимого папки (scandir)
<?php
$files = scandir('/var/www/html');
echo "Файлы в корне сайта:\n";
foreach ($files as $file) {
if ($file != '.' && $file != '..') {
echo $file . "\n";
}
}
?>
4. Удаление, копирование и проверка существования файлов
4.1. Удаление файлов (unlink)
<?php
$file = 'old_report.pdf';
if (file_exists($file)) {
if (unlink($file)) {
echo "Файл удалён";
} else {
echo "Ошибка удаления (возможно, нет прав)";
}
} else {
echo "Файл не найден";
}
?>
4.2. Копирование (copy) и перемещение (rename)
<?php
// Копирование
copy('source.txt', 'backup/source_backup.txt');
// Перемещение (переименование)
rename('temp/tmp_file.txt', 'final/report.txt');
?>
4.3. Проверка существования и типа
<?php
$path = 'config.php';
if (file_exists($path)) {
echo "Существует. ";
if (is_file($path)) {
echo "Это файл.";
} elseif (is_dir($path)) {
echo "Это папка.";
}
echo " Размер: " . filesize($path) . " байт";
echo " Последнее изменение: " . date("d.m.Y H:i", filemtime($path));
}
?>
5. Безопасность при работе с файловой системой
Работа с фай