Работа с файловой системой в PHP: практические примеры и советы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с файловой системой в PHP: от основ к реальным проектам

Работа с файловой системой — одна из ключевых задач любого веб-разработчика. В PHP для этого существует мощный набор встроенных функций, позволяющих создавать, читать, редактировать и удалять файлы, а также управлять директориями. В этой статье мы разберем практические примеры, которые помогут вам освоить работу с файлами на PHP и применять эти знания в реальных проектах.

Независимо от того, создаете ли вы систему логирования, загрузчик файлов или просто сохраняете данные пользователей, понимание основ файловой системы в PHP — обязательный навык. Давайте перейдем к практике.

Основные функции для работы с файлами

PHP предоставляет несколько способов взаимодействия с файлами. Самые популярные — это использование fopen, fwrite, fread и высокоуровневых функций file_get_contents и file_put_contents. Рассмотрим их на примерах.

Создание и запись в файл

Для создания файла и записи в него используйте функцию fopen с режимом 'w' (запись с очисткой) или 'a' (добавление в конец).

<?php
$filename = 'log.txt';
$file = fopen($filename, 'w');

if ($file) {
    fwrite($file, "Строка 1: Запись в файл\n");
    fwrite($file, "Строка 2: Еще одна запись\n");
    fclose($file);
    echo "Файл успешно создан и записан.";
} else {
    echo "Ошибка открытия файла.";
}
?>

Если нужно быстро записать данные без управления указателем, используйте file_put_contents:

<?php
$data = "Новый контент для файла.\nВторая строка.";
file_put_contents('data.txt', $data);
echo "Данные записаны.";
?>

Чтение файла

Для чтения файла построчно используйте fgets в цикле:

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

Альтернатива — file_get_contents для чтения всего содержимого в строку:

<?php
$content = file_get_contents('log.txt');
echo nl2br($content);
?>

Проверка существования и свойств файлов

Перед работой с файлом важно убедиться, что он существует и доступен для чтения или записи. PHP предоставляет функции file_exists, is_readable, is_writable и filesize.

Пример проверки файла

<?php
$file = 'config.php';

if (file_exists($file)) {
    echo "Файл существует.<br>";
    
    if (is_readable($file)) {
        echo "Файл доступен для чтения.<br>";
        echo "Размер файла: " . filesize($file) . " байт.";
    } else {
        echo "Файл существует, но не доступен для чтения.";
    }
} else {
    echo "Файл не найден.";
}
?>

Проверка типа файла

Функция filetype возвращает тип файла: 'file', 'dir', 'link' и другие.

<?php
$path = 'uploads';
if (file_exists($path)) {
    echo "Тип: " . filetype($path); // выведет 'dir' если это папка
}
?>

Управление директориями

Работа с папками в PHP не менее важна. Вы можете создавать, удалять и сканировать директории.

Создание и удаление папок

<?php
// Создание папки
if (!file_exists('backup')) {
    mkdir('backup', 0777, true); // третий параметр true — рекурсивное создание
    echo "Папка создана.";
}

// Удаление пустой папки
if (file_exists('temp')) {
    rmdir('temp');
    echo "Папка удалена.";
}
?>

Сканирование содержимого директории

Функция scandir возвращает массив всех файлов и папок внутри указанной директории:

<?php
$dir = 'uploads';
$files = scandir($dir);

echo "Содержимое папки '$dir':<br>";
foreach ($files as $file) {
    if ($file !== '.' && $file !== '..') {
        echo $file . "<br>";
    }
}
?>

Практический пример: система логирования

Теперь объединим полученные знания в реальном проекте. Создадим простую систему логирования, которая записывает действия пользователя в файл с меткой времени.

<?php
class Logger {
    private $logFile;
    
    public function __construct($filename = 'app.log') {
        $this->logFile = $filename;
        
        // Создаем папку для логов, если её нет
        $dir = dirname($filename);
        if (!file_exists($dir)) {
            mkdir($dir, 0777, true);
        }
    }
    
    public function log($message) {
        $timestamp = date('Y-m-d H:i:s');
        $logEntry = "[$timestamp] $message" . PHP_EOL;
        
        // Добавляем запись в конец файла
        file_put_contents($this->logFile, $logEntry, FILE_APPEND | LOCK_EX);
    }
    
    public function getLogs() {
        if (!file_exists($this->logFile)) {
            return [];
        }
        
        $content = file_get_contents($this->logFile);
        return explode(PHP_EOL, trim($content));
    }
}

// Использование
$logger = new Logger('logs/actions.log');
$logger->log("Пользователь вошел в систему.");
$logger->log("Пользователь создал новый пост.");

echo "Последние логи:<br>";
$logs = $logger->getLogs();
foreach (array_reverse($logs) as $log) {
    echo $log . "<br>";
}
?>

Важные моменты безопасности

При работе с файловой системой в PHP всегда помните о безопасности: