Практическая работа №13: Работа с файловой системой в PHP
Работа с файловой системой в PHP
Section titled “Работа с файловой системой в PHP”Цель работы: Научиться работать с файлами и директориями в PHP: чтение и запись файлов, получение метаданных (размер, права), создание/удаление/копирование каталогов, рекурсивные операции, корректная обработка загрузки файлов и базовые приёмы обеспечения безопасности.
Основные теоретические положения
Section titled “Основные теоретические положения”1. Что такое файловая система с точки зрения PHP?
Section titled “1. Что такое файловая система с точки зрения PHP?”Файловая система — это иерархическая структура для хранения файлов и директорий на диске. PHP предоставляет набор встроенных функций для работы с файловой системой: чтение/запись, проверка существования, получение метаданных, изменение прав, работа с потоками и блокировками и т.д.
2. Ключевые функции и возможности
Section titled “2. Ключевые функции и возможности”Ниже перечислены основные функции, которые понадобятся в работе:
-
Проверка и информация:
file_exists($path),is_file($path),is_dir($path)filesize($path)— размер файла в байтахfileperms($path)— права доступа (числовой битовый набор)fileowner($path),filegroup($path)— владелец/группа (не всегда доступны на Windows)realpath($path)— абсолютный путь (полезен для безопасности)mime_content_type($path)/finfo_file()— определение MIME-типа
-
Чтение и запись:
file_get_contents($file),file_put_contents($file, $data, $flags = 0)(с флагамиFILE_APPEND,LOCK_EX)fopen($file, $mode),fread(),fwrite(),fclose(),feof()- Потоки (stream) и функции
stream_get_contents,fseek,ftell
-
Работа с директориями:
scandir($dir),opendir(),readdir(),closedir()mkdir($dir, $mode = 0777, $recursive = false),rmdir($dir)— удалить пустой каталогglob($pattern)— поиск файлов по шаблону
-
Управление файлами:
copy($source, $dest),rename($old, $new),unlink($file)— удалениеtouch($file, $time = null)— изменить время доступа/измененияchmod($file, $mode)— изменить права доступаflock($handle, LOCK_EX)— файловая блокировка
-
Безопасность:
- Проверка и нормализация путей (
realpath) — предотвращение path traversal. - Валидация расширений и MIME-типа при загрузке.
- Использование
basename()и белого списка допустимых имён/расширений. - Правильная установка прав и использование
umask()при создании временных файлов/директорий.
- Проверка и нормализация путей (
Алгоритм выполнения работы
Section titled “Алгоритм выполнения работы”1. Подготовка файла
Section titled “1. Подготовка файла”- Создайте файл
filesystem.php. - В начале файла откройте PHP-блок
<?php ... ?>.
2. Реализация заданий
Section titled “2. Реализация заданий”- Реализуйте каждый пункт практики в отдельном блоке кода с комментариями.
- Для вывода результатов используйте
echo/printfи аккуратно форматируйте (например —<pre>для структурированных данных). - По возможности пишите небольшие пользовательские функции для повторяющихся операций (например, рекурсивный подсчёт размера каталога).
3. Тестовые данные
Section titled “3. Тестовые данные”- В корне практики создайте тестовую директорию
test_data/с несколькими файлами и подкаталогами (код должен сам создавать тестовые файлы, если их нет). - Не используйте опасные пути; все операции выполняйте в пределах
test_data/.
Задания для выполнения
Section titled “Задания для выполнения”Часть 1 — Базовые операции (стандартные функции)
Section titled “Часть 1 — Базовые операции (стандартные функции)”Для каждого пункта напишите отдельный кодовый блок, выведите исходные данные и результат.
- Создайте в папке
test_data/файлhello.txtсо строкойHello, filesystem!. (Используйтеfile_put_contentsи проверьтеfile_exists.) - Прочитайте
hello.txtи выведите содержимое на экран (file_get_contents). - Узнайте размер
hello.txtи выведите его. - Узнайте и выведите права доступа к файлу в восьмеричном формате (пример:
0644). (Используйтеfileperms+sprintf.) - Создайте поддиректорию
test_data/uploads/(если её нет) с правами0755. - Скопируйте
hello.txtвtest_data/uploads/hello_copy.txt. - Переименуйте
hello_copy.txtвgreeting.txt. - Удалите временный файл
test_data/temp.txt, если он существует. - Сгенерируйте список файлов в
test_data/и выведите только имена файлов (используйтеscandirилиglob). - Используя
glob, найдите все.txtфайлы вtest_data/и выведите их количество.
Часть 2 — Работа с потоками и блокировками
Section titled “Часть 2 — Работа с потоками и блокировками”- Откройте
test_data/log.txtв режимеa+, запишите в него строку с текущей датой и временем, гарантируя эксклюзивную блокировку (flock), затем закройте файл. - Прочитайте и выведите последние 5 строк из
test_data/log.txt. (Можно читать с конца — примерно:fseekиfread, либо считать весь файл и взятьarray_slice.)
Часть 3 — Рекурсивные операции и информация о каталоге
Section titled “Часть 3 — Рекурсивные операции и информация о каталоге”- Напишите функцию
dir_size($dir)— возвращает суммарный размер всех файлов в каталоге (рекурсивно). - Напишите функцию
delete_dir($dir)— рекурсивно удаляет каталог и всё содержимое (осторожно: test_data/ только). - Напишите функцию
copy_dir($src, $dst)— рекурсивно копирует содержимое каталога. - Выведите количество файлов и количество поддиректорий в
test_data/(рекурсивно).
Часть 4 — Пользовательские функции (реализовать и протестировать)
Section titled “Часть 4 — Пользовательские функции (реализовать и протестировать)”safe_filename($name)— очищает имя файла от недопустимых символов, оставляет только латиницу, цифры, дефисы и подчёркивания, заменяет пробелы на_. Возвращает безопасное имя.store_json($path, $data)— сериализует массив в JSON и безопасно записывает в файл (atomic write: запись во временный файл +rename).read_csv($path): array— читает CSV-файл и возвращает массив строк (используйтеfgetcsv).list_files_by_ext($dir, array $exts): array— возвращает список файлов с указанными расширениями (рекурсивно).
Часть 5 — Имитация безопасной загрузки файла (без фронтенда)
Section titled “Часть 5 — Имитация безопасной загрузки файла (без фронтенда)”Напишите обработчик (функцию) handle_upload(array $uploadedFile, string $destDir) который:
- Проверяет наличие ошибок загрузки (эмулируйте массив, похожий на
$_FILES['file']). - Проверяет расширение и MIME по белому списку (
['jpg','png','pdf','txt']). - Приводит имя к безопасному варианту
safe_filename. - Записывает файл в
uploads/с уникальным именем (например,uniqid()+ расширение). - Возвращает путь сохранённого файла или текст ошибки.
Важно: обработчик должен демонстрировать основные шаги безопасности (проверка MIME, ограничение размера, basename/realpath, запись только в директорию назначения).
Контрольные вопросы
Section titled “Контрольные вопросы”- Что такое файловая система и какие функции PHP используются для проверки существования файла и директории?
- Чем отличается
file_get_contentsот использованияfopen/fread? - Как безопасно записать данные в файл, чтобы избежать одновременной порчи данных несколькими процессами?
- Что такое path traversal и как от него защититься в PHP?
- Как получить права доступа файла в человекочитаемом восьмеричном виде?
- Для чего нужна функция
realpath? - Почему важно валидировать MIME-типы и расширения при загрузке файлов?
- Что такое atomic write при записи файлов и как его реализовать?
Критерии оценки
Section titled “Критерии оценки”- Корректное использование стандартных функций чтения/записи и работы с директориями: 30%.
- Правильная реализация рекурсивных операций (копирование, удаление, подсчёт размера): 25%.
- Реализация безопасного хранилища/обработчика загрузки и функций безопасности (safe_filename, realpath): 20%.
- Оформление кода, комментарии, читаемость и ответы на контрольные вопросы: 15%.
- Дополнительные полезные функции/логгирование/тестовые наборы: 10%.
Рекомендации по оформлению кода
Section titled “Рекомендации по оформлению кода”- Комментируйте каждый блок: что делает функция, какие параметры и что возвращает.
- Не выполняйте потенциально опасные операции вне
test_data/— все пути должны быть ограничены корневой тестовой директорией. - Используйте
try/catchи проверяйте возвращаемые значения функций. - Если используете многобайтовые строки в именах файлов (редкие случаи), будьте аккуратны с функциями преобразования — чаще используйте латиницу в имёнах файлов.
Рекомендуемая литература
Section titled “Рекомендуемая литература”- php.net — Документация по файловым функциям и потокам PHP (разделы
FilesystemиStreams). - W3Schools — Краткие примеры по работе с файлами (см. раздел PHP File Handling).
- PHP The Right Way — Рекомендации по лучшим практикам (включая безопасность при работе с файлами).
- Дэвид Скляр — (пример книги/учебника по PHP; для дополнительного чтения — главы о файловых операциях).