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

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

Вопросы:

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

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


person kamlesh.bar    schedule 22.01.2015    source источник


Ответы (1)


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

При выполнении листинга контейнера вы можете указать "префикс" и "формат" параметра запроса, чтобы возвращать только объекты, начинающиеся с определенного префикса (в вашем случае, имени пользователя), и возвращать результаты в формате 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 000 объектов, вам нужно будет изучить использование параметра запроса «маркер» для страницы результатов.

Кроме того, вы можете рассмотреть возможность разделения пользователей на несколько контейнеров. Мы рекомендуем сделать это, чтобы помочь получить более точные результаты в отношении возможного окна согласованности (подробнее об этом позже). Например, создайте контейнеры от «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».

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

person hurricanerix    schedule 28.01.2015