我有多个图像存储在以下网址中:/uploads/hash/IMAGE001.jpg
。使用jQuery UI的sortable()
,我想要异步地排序和存储图像的顺序。
我想出了几种方法来做到这一点,我很好奇最好的方法是什么。
我可以为每个/hash/
目录创建一个包含3列(ID,IMAGE_URL,IMAGE_INDEX)的SQL表,并在每种情况下更新表的_INDEX值。然后,我可以通过ORDER BY IMAGE_INDEX查询数据库来获取IMAGE_URL的排序列表。
我的另一个想法是用前面的0000
命名文件(例如/uploads/hash/0000IMAGE001.jpg)。如果我在各种类型的PHP中重命名文件,我可以使用/hash/
获取PHP中的opendir()
图像目录而不需要SQL开销,然后在客户端或服务器端按文件名排序。
我是否会遇到大量并发文件重命名(vs并发SQL表更新)的任何瓶颈问题?从PHP获取目录列表的性能与使用ORDER BY查询SQL有何不同?
答案 0 :(得分:3)
在这种情况下,您应该使用数据库进行排序,
文件系统未设计用于排序和管理变更。
使用数据库是任何“真实”应用程序的方法,使用文件系统是一个快速的黑客。
答案 1 :(得分:0)
数据库经过精心设计和优化,可用于存储和检索数据。更改文件名以存储数据(如排序顺序)通常不是理想的选择。根据文件系统的不同,性能会有很大差异,故障也是灾难性的。绝对在这里使用数据库选项。
答案 2 :(得分:0)
如果您要使用PHP opendir()
获取文件列表,可以使用一些技巧来避免瓶颈。
首先,您可以使用touch()
对列表进行预排序,以更新文件修改时间,这将对opendir()
返回的列表进行排序。
要进行更多优化,请使用目录作为存储桶来加速排序。例如,IMAGEDIR/a/
,IMAGEDIR/b/
等。您可以根据需要开发更高级的目录树。
通过系统目录使用存储桶排序,它将进行优化,以便为尚未排序的项目保留单独的文件夹,并批量对整批进行排序。使用包含要排序的整个对象集的子集的存储桶,通过使任何给定的排序操作更小来加快对列表进行排序所花费的时间,并使用touch()
来保留排序将减少排序的次数排序算法将运行。