如何使用 PHP 从 Rackspace Cloud Files 容器内的文件夹获取文件夹大小?

How to get folder size from folder inside Rackspace Cloud Files container using PHP?

基本上我在 Rackspace 云文件中创建了一个容器,比方说 work。在 work 中,我有很多按用户名分类的文件夹(动态文件夹作为新用户注册并分配 1 GB 的 space)。每次用户上传文件时,我想在允许他上传之前检查用户是否超过了他的限制。我正在使用 Laravel PHP 框架和 Rackspace 开放云 SDK。

问题:

  1. 我想获取在主容器("xyz") 下创建的特定用户文件夹的文件夹大小。

  2. 有没有其他方法可以实现用户是否超限?

  1. I want to get folder size of particular user's folder created under main container("xyz").

执行容器列表时,您可以仅向 return object 提供一个 "prefix" and "format" query parameter 以特定前缀(在您的情况下为用户名)开头,并且 return 格式为 JSON/XML 的结果。当结果在 JSON 或 XML 中被 return 编辑时,它们包含有关 object 的附加信息。以下是 JSON 响应的示例:

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

注意:使用此解决方案,如果返回 10k objects,您将需要考虑使用“marker”查询参数对结果进行分页.

此外,您可以考虑将用户分成多个容器。就最终一致性 window(稍后会详细介绍)而言,我们建议这样做以帮助获得更准确的结果。例如,创建容器“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. Is there any other way to achieve whether user has exceed limit or not.

如果您对用户增长的速度有限制,或者可以限制用户总数,那么您可以考虑为每个用户创建一个容器。这样做的缺点是,您将通过每个帐户的最大容器数 (500,000) 来限制您可以支持的用户数量。但它将允许您使用 container quota 功能。使用此功能,如果您尝试 PUT object 并且超过配额,您将收到 HTTP 413 响应。您还可以使用 "X-Container-Bytes-Used" header.

检查用户的使用情况

注意: 我之前提到过“最终一致性 window”。在某些情况下,容器 listings/quotas 可能不会立即更新,但最终会更新。在大多数情况下,这种延迟要么不明显,要么很小。但是,如果您的用例要求绝对不允许用户上传超出其配额的内容,那么您可能需要寻找一种替代方法来跟踪用户的使用情况(例如本地数据库)。