数百万张图像命名的正确方法是什么?

时间:2017-06-22 07:12:15

标签: php codeigniter

我有一个图片上传表单,可以上传大量(可能是数百万)的记录。像用户的个人资料图片,目前我们正在给出命名为

'some_constant_string'.time().[image_file_extension];

,例如 'tcs'.time().'jpg'; 这是一种正确的方法,还是会产生一些重复的问题。请帮助正确的方法!

目前使用PHP 5.6与Codeigniter Framework 3.0

4 个答案:

答案 0 :(得分:1)

这不是正确的做法。如果两个用户同时触发上传事件,他们都会有1234.jpg,导致至少有一个混淆的用户。

对于唯一名称,有uniqid()。这将解决您当前的问题。

但是, 还有另一个(IMO更好)解决方案 使用正确的dirnames ,例如/uploads/user_id/some-image.jpg。这将为您带来更多优势 至少,重复的文件名(几乎)是不可能的。您现在还可以更有效地使用scandir()等函数,因为您无需检查大量图像。如果您删除用户,只需删除/uploads/user_id/即可轻松删除所有图片。

答案 1 :(得分:1)

如果你希望很多文件是uploades,我会稍微改变一下。

我会将命名更改为以下内容:

<user_id> . '_' .microtime(true) . <img_extension>

然后,重复图像的问题会更少,因为同一用户的两个图像应该在同一个微秒内处理。如果您认为自己仍然可能遇到问题,可以试试这个:

<user_id> . '_' . microtime(true) . '_' . <inc> . <img_extension>

这里的值可能是soee中的一个计数器,用于重命名图像的循环或db id中的自动增量字段,需要集中处理。

另一个人认为你应该注意的是如何存储所有图像。把所有这些都放在同一个文件夹中是一个坏主意,所以在寻找名称时我会建议创建一个forder结构,例如:

你有这个档案:

123_1498116500_1.jpg

您可以拆分为这样的文件夹结构:

/123/149/811/650/123_1498116500_1.jpg

使用这种结构,当操作系统管理具有数千个文件的文件夹时,您将避免一些开销。

希望有所帮助:)

答案 2 :(得分:0)

由于time()(显然)具有一秒钟的分辨率,因此您需要将图像处理限制为每秒一次。但是平均每天只有86,400秒 - 只需要数学。

uniqid()应该是更好的选择 - 不要忘记启用$more_entropy参数。

答案 3 :(得分:0)

图像的重复是可能的,但只有当2个或更多用户同时上传图像时才会发生。 您可以使用MD5(或其他内容)来唯一标识您的图片,或使用类似uniqid()

的内容