Как насчет легковесного, но умного файлового хранилища? Хотите хранить файлы без дубликатов, но с возможностью видеть все загружаемые файлы? Да так, чтобы без всяких баз данных и прочих сложностей? Легко! Для демонстрации такого я сделал простое, но функциональное файловое хранилище на PHP CLI. Аналог такого я лет 15 назад реализовал в лучшей системе управления сайтами Way To Web 3.0, которую я перестал развивать 7 лет назад, но она по-прежнему лучшая. Моя субъективная оценка.
Вернемся к хранилищу. Какие задачи решает такое хранилище?
- Файлы не дублируются, даже если загружаются с разными именами - экономия места.
- Можно видеть все загруженные имена файла благодаря alias.json - пользователи продолжают работать со "своими" файлами.
- Хэшируем файлы, так что данные не теряются и не изменяются - можно проверять файлы на неизменность, например вылавливать вирусы, инъекции вредоносного кода и т.п.
- Не нужна база данных – только файловая система - меньше технологий - легче настраивать и управлять.
- Гибкая структура хранения – папки строятся на основе SHA-256 с разбивкой - файлы автоматически и равномерно распределяются по папкам файловой системы, при этом имена папок управляемые. И главное, можно сделать распределенное хранилище - часть имен на одном сервере, часть на другом.
---
Что такое хеш файла и зачем он нужен?
Хеш файла – это уникальный цифровой отпечаток, который вычисляется на основе содержимого файла с помощью специальных криптографических алгоритмов, например, SHA-256. Если даже один байт в файле изменится, хеш будет совершенно другим.
Для чего он нужен?
- Определение уникальности – файлы с одинаковым содержимым всегда будут иметь одинаковый хеш.
- Защита от изменений – если кто-то изменит файл, хеш изменится, и это сразу заметно.
- Оптимизация хранения – можно хранить один файл, но с разными именами, что экономит место.
- Быстрая проверка целостности – можно легко проверить, не был ли поврежден файл при передаче.
---
Где пригодится?
- Если вам нужно простое S3-подобное хранилище.
- Когда файлы заливаются пользователями, но не хочется хранить копии.
- Если хочется минимальной нагрузки на сервер и простоты в коде.
---
Как это работает?
1. Файл загружается в хранилище через store.php.
2. Вычисляется SHA-256 хеш файла.
3. Формируется путь к папке: берем первые символы хеша и создаем вложенные каталоги.
4. Если файл уже есть, просто записываем его имя в alias.json.
5. Файл всегда хранится в одной копии, даже если загружен 100 раз с разными именами.
Вы получили простое, надежное и безбазовое хранилище с умной обработкой файлов. Минимум кода, максимум пользы. Теперь можно строить свой S3 на PHP CLI!