BonBonSlick
@BonBonSlick
Web Developer Trainee

Как подсчитывать используемое юзером дисковое пространство на сервере?

Задача, хранилище файлов, выставлять счет клиенту за N используемого пространства.

Первые варианты что приходят в голову
1 - считать по записям в БД указывая количество байтов каждой сущности.
Недостатки, количество файлов на сервере может отличаться от записей в БД и подсчет всех сущностей весьма накладная операция
2 - складывать все фалы юзера в его личную папочку на сервере и просто считывает ее размер
Недостатки такие же как и в верху. А потому надо сверять какие файлы есть и удалять каких нет в БД актуализируя и выдавая корректный результат.
3 - при загрузке файла на сервер юзером инкрементить запись в БД на размер файла, в случае удаления записи из БД, слушатель на сущность который удаляет файл, и все завернуть в транзакцию. Удаление файла после записи в БД, если файл не удален, ексепшен и роллбек.

Ммм думаю есть и другие варианты, довольно поздно и уже мозги не варят какой из подходов выбрать и почему.
К примеру забить на синхронизацию удаления, добавить крон который будет пробигать каждую неделю и чистить орфанов, гостов, файлы без владельца.

Кто посоветует что?
Скорее всего тут есть уже те кто реализовал такую фичу, как решили проблему синхронизации БД записей файлов и файловой системы, наличие файлов на серверах?

П.С. линукс добавил т.к. возможно надо будет выполнить что-то типа
exec('sudo du -shc /var/www/project_name/public/files/user_1/files/*')
это будет зависить от подхода.
  • Вопрос задан
  • 366 просмотров
Решения вопроса 3
sergey-gornostaev
@sergey-gornostaev
Седой и строгий
Использовать дисковое квотирование.
Ответ написан
ky0
@ky0
Миллиардер, филантроп, патологический лгун
А вам принципиально полностью свой велосипед сковородить? Потому что есть некоторое количество опенсорсных проектов, делающих то же самое, взять хотя бы min.io.
Ответ написан
@rPman
Не надо делать через сканирование файлов и тем более и базы данных, с хардлинками, дырявыми файлами, сжатием и даже дедупликацией (если используешь) замаешься.

Банальный пример, кому приписывать занятый размер если у человека файл, это хардлинк на файл, созданный другим пользователем (например админом)? кстати я сам хз как с этим обычно разбираются? а скорее всего никак, приписывают пользователю все лишнее.

Самый правильный способ через дисковые квоты ОС, и если честно лучше продавать пользователю расширение квоты, а не занимаемое им место.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы