gpt4 book ai didi

php - 当 LAMP 服务器上有数百万用户时,存储和获取图像的最快、最有效的方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 00:35:18 26 4
gpt4 key购买 nike

这是迄今为止我想出的最好的方法,我想知道是否有更好的方法(我相信有!)来存储和获取数百万用户图像:

为了减小目录大小并避免对数据库进行任何额外调用,我使用了基于用户唯一 ID 计算的嵌套目录,如下所示:

$firstDir = './images';
$secondDir = floor($userID / 100000);
$thirdDir = floor(substr($id, -5, 5) / 100);
$fourthDir = $userID;
$imgLocation = "$firstDir/$secondDir/$thirdDir/$fourthDir/1.jpg";

用户 ID ($userID) 的范围从 1 到数百万。

例如,如果我有用户 ID 7654321,该用户的第一张图片将存储在:

./images/76/543/7654321/1.jpg

对于用户 ID 654321:

./images/6/543/654321/1.jpg

对于用户 ID 54321 它将是:

./images/0/543/54321/1.jpg

对于用户 ID 4321 它将是:

./images/0/43/4321/1.jpg

对于用户 ID 321 它将是:

./images/0/3/321/1.jpg

对于用户 ID 21 它将是:

./images/0/0/21/1.jpg

对于用户 ID 1 它将是:

./images/0/0/1/1.jpg

这确保了在最多 100,000,000 个用户的情况下,我的目录永远不会包含超过 1,000 个子目录,因此它似乎保持了整洁和高效。

我针对使用以下“散列”方法对这种方法进行了基准测试,该方法使用 PHP (crc32) 中可用的最快散列方法。这种“散列”方法将第二个目录计算为用户 ID 散列中的前 3 个字符,将第三个目录计算为接下来的 3 个字符,以便随机但均匀地分布文件,如下所示:

$hash = crc32($userID);
$firstDir = './images';
$secondDir = substr($hash,0,3);
$thirdDir = substr($hash,3,3);
$fourthDir = $userID;
$imgLocation = "$firstDir/$secondDir/$thirdDir/$fourthDir/1.jpg";

但是,这种“散列”方法比我前面描述的方法慢,所以它不是什么好东西。

然后我更进一步,在我的原始示例 (floor(substr($userID, -5, 5)/100));) 中找到了一种更快的计算第三目录的方法如下:

$thirdDir = floor(substr($userID, -5, 3));

现在,这改变了前 10,000 个用户 ID 的存储方式/位置,使某些第三个目录具有 1 个用户子目录或 111 个而不是 100 个,但它具有速度更快的优势,因为我们不必划分100,所以从长远来看,我认为这是值得的。

定义目录结构后,我计划如何存储实际的单张图片:例如,如果用户上传第二张图片,它将与第一张图片放在同一目录中,但它会被命名为2.jpg。用户的默认图片始终只是 1.jpg,因此如果他们决定将他们的第二张图片设为默认图片,则 2.jpg 将重命名为 1.jpg1.jpg 将重命名为 2.jpg

最后但同样重要的是,如果我需要存储同一图像的多种尺寸,我会为用户 ID 1 按如下方式存储它们(例如):

1024 像素:

./images/0/0/1/1024/1.jpg
./images/0/0/1/1024/2.jpg

640 像素:

./images/0/0/1/640/1.jpg
./images/0/0/1/640/2.jpg

就是这样。

那么,这种方法有什么缺陷吗?如果有,请指出它们好吗?

有没有更好的方法?如果是这样,您能描述一下吗?

在我着手实现它之前,我想确保我有最好、最快和最有效的方法来存储和检索图像,这样我就不必再次更改它。

谢谢!

最佳答案

不要关心计算路径的速度差异,没关系。重要的是图像在目录中的分布有多好和均匀,生成的路径有多短,推断命名约定有多难(让我们将 1.jpg 替换为 2.jpg..哇,它正在工作..) .

例如,在您的哈希解决方案中,路径完全基于用户 ID,这会将属于一个用户的所有图片放在同一目录中。

使用整个字母表(小写和大写,如果您的 FS 支持的话),而不仅仅是数字。检查其他软件的功能,检查散列目录名称的好地方是 google chrome、mozilla,...最好使用短目录名称。查找速度更快,在 html 文档中占用的空间更少。

关于php - 当 LAMP 服务器上有数百万用户时,存储和获取图像的最快、最有效的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6877771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com