Как получить размер папки из папки внутри контейнера Rackspace Cloud Files с помощью PHP?

По сути, я создал контейнер внутри Rackspace Cloud Files, скажем, work, внутри work У меня так много папок по имени пользователя (динамические папки, когда новые пользователи регистрируются и выделяют 1 ГБ места). Каждый раз, когда пользователь загружает файл, я хочу проверить, превышает ли пользователь свой лимит, прежде чем разрешить ему загрузку. Я использую Laravel PHP Framework вместе с Rackspace Open Cloud SDK.

Вопросы:

  1. Я хочу получить размер папки конкретного пользователя, созданной в основном контейнере ("xyz").

  2. Есть ли другой способ достичь того, превысил ли пользователь предел или нет?

1 ответ

Решение
  1. Я хочу получить размер папки конкретного пользователя, созданной в основном контейнере ("xyz").

Выполняя перечисление контейнера, вы можете предоставить параметр запроса "prefix" и "format", чтобы возвращать только те объекты, которые начинаются с определенного префикса (в вашем случае имя пользователя), и возвращать результаты в формате JSON/XML. Когда результаты возвращаются в JSON или XML, они содержат дополнительную информацию об объектах. Ниже приведен пример ответа JSON:

[
    {
        "bytes": 13,
        "content_type": "text/plain",
        "hash": "8ddd8be4b179a529afa5f2ffae4b9858",
        "last_modified": "2015-01-27T00:08:44.671230",
        "name": "<username>/some_object.txt"
    },
    ...
]

ПРИМЕЧАНИЕ. С помощью этого решения, если вы получите 10 тыс. Объектов, вам понадобится использовать параметр запроса "маркер" для отображения результатов поиска.

Кроме того, вы можете рассмотреть возможность разделения ваших пользователей на несколько контейнеров. Мы рекомендуем делать это, чтобы помочь получить более точные результаты в отношении возможного окна согласованности (подробнее об этом позже). Например, создайте контейнеры с "work_0" по "work_9999" и определите, какие пользователи переходят в какие контейнеры с чем-то похожим на следующее:

$user_md5 = md5($username);
// Only use part of the md5sum, unless you have support for big (128-bit) integers
$user_int = hexdec(str_split($user_md5, 7)[0]);
$container_id =  $user_int % 10000;
$container_name = "work_$container_id";
print "Container for user \"$username\" is \"$container_name\"\n";
  1. Есть ли другой способ добиться того, превысил ли пользователь предел или нет.

Если у вас есть ограничения в отношении того, насколько быстро будут расти ваши пользователи, или вы можете ограничить общее количество пользователей, то вы можете рассмотреть возможность создания контейнера для каждого пользователя. Недостатком этого является то, что вы ограничите количество пользователей, которых вы можете поддерживать, максимальным количеством контейнеров на учетную запись (500 000). Но это позволит вам использовать функцию квоты контейнера. Используя эту функцию, если вы попытаетесь поставить объект и превысите квоту, вы получите ответ HTTP 413. Вы также сможете проверить использование пользователя с помощью заголовка "X-Container-Bytes-Used".

ПРИМЕЧАНИЕ. Ранее я упоминал "окно согласованности". В некоторых случаях списки / квоты контейнеров могут обновляться не сразу, но в конечном итоге они обновляются. В большинстве ситуаций эта задержка либо незаметна, либо минимальна. Однако, если ваш вариант использования требует, чтобы пользователям абсолютно не разрешалось загружать за пределы своей квоты, вам, возможно, придется искать альтернативный метод для отслеживания использования пользователя (например, локальная база данных).

Другие вопросы по тегам