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

前端之家收集整理的这篇文章主要介绍了php – 当LAMP服务器上有数百万用户时,存储和获取图像的最快和最有效的方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是迄今为止我提出的最好的方法,我想知道是否有更好的方法(我确定有!)用于存储和获取数百万用户图像:

为了保持目录大小不变并避免对数据库进行任何其他调用,我使用的嵌套目录是根据用户的唯一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,3);
$thirdDir = substr($hash,3,3);
$fourthDir = $userID;
$imgLocation = "$firstDir/$secondDir/$thirdDir/$fourthDir/1.jpg";

但是,这种“哈希”方法比我前面描述的方法慢,所以它没有用.

然后我更进了一步,发现了一个更快的方法来计算我原来的例子中的第三个目录(floor(substr($userID,5)/ 100);)如下:

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

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

一旦定义了目录结构,这就是我计划存储实际单个图像的方式:例如,如果用户上传第二张图片,它将与第一张图片位于同一目录中,但它将被命名为2.jpg .用户的默认pic总是只有1.jpg,所以如果他们决定将他们的第二张图片作为默认图片,那么2.jpg将被重命名为1.jpg,而1.jpg将被重命名为2.jpg.

最后但并非最不重要的是,如果我需要存储同一图像的多个大小,我会按如下方式存储它们用于用户ID 1(例如):

1,024像素:

./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哇,它正在工作……) .

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

使用整个字母(大写字母,如果您的FS支持它),而不仅仅是数字.检查其他软件的功能,检查哈希直接名称的好地方是google chrome,mozilla,…最好有短目录名称.查找速度更快,占用的html文档空间更少.

原文链接:https://www.f2er.com/php/134182.html

猜你在找的PHP相关文章