这是一个完全理论化的问题 .
我有一个照片存储网站,其中照片由网站上注册的用户上传 .
The Question
-
哪种方法更快?
-
当我需要使用大量计算机和硬盘时,长期更好?
-
有没有其他方法更好?
现在我想到了两种完成这些东西的方法 .
上传到我的服务器的文件预计会超过〜> 1亿
方法1
这两个 /pictures/hd/
& /pictures/low/
目录将包含用户上传的所有文件 .
$newfilename = $user_id.time().$filename; //$filename = actual filename of uploaded file
$src = '/pictures/hd/'.$newfilename; //for hd pics
将其插入到mysql中
insert into pics(`user_id`,`src`)VALUES('$user_id','$newfilename')
方法2
这两个 /pictures/hd/
& /pictures/low/
目录将包含用户上载的文件的子目录 .
这将创建许多子目录,其名称为将该文件上载到服务器的用户的 user_id
.
if (!is_dir('/pictures/hd/'.$user_id.'/')) {
mkdir('/pictures/hd/'.$user_id.'/');
}
$newfilename = $user_id.'/'.$user_id.time().$filename; //$filename = actual filename of uploaded file
$src = '/pictures/hd/'.$newfilename; //for hd pics
将其插入到mysql中
insert into pics(`user_id`,`src`)VALUES('$user_id','$newfilename')
Retrieval
检索图像时,我可以使用 pics
表的 src
列获取文件名,并使用 '/pictures/hd/'.$src_of_picstable
和lowq文件使用 '/pictures/low/'.$src_of_picstable
浏览hd文件
2 回答
我不建议单目录方法有两个原因 . 首先,如果您计划拥有大量图像,那么您的目录将变得非常大 . 手动搜索单个图像需要更长的时间 . 在调试测试新功能时需要这样做 .
多个目录的第二个原因是您可以对图库的一部分进行较小的备份 . 如果你有一个非常大的画廊(比方说几兆兆字节)单个硬盘驱动器可能不足以容纳它们 . 使用多个目录,您可以将每个目录安装在单独的硬盘驱动器上,这样处理几乎无限大小的库 .
我最喜欢的方法是YYYY / MM /图像类型目录结构 . 通过这种方式,您可以通过逐月查看来确定何时引入了一些错误 . 此外,您可以进行每月备份而无需复制冗余文件 . 同时制作所有图库的季度快照以防万一 .
关于图像类型,我可能需要几种类型的图像,如原始图像,小缩略图,缩略图,普通图像等 . 这样我只需交换图像类型并获得不同的图像大小 .
至于你我会建议YYYY / MM / type-of-image / user_id方法,你可以在一个地方轻松找到所有用户上传的文件 .
回答问题的正确方法是测试它 .
哪个更快将取决于文件的数量和underlyng文件系统; ext3,4将很乐意处理单个目录中的大量文件(dentry atr在HTree索引中管理) . 有些文件系统只使用简单列表 . 其他人有不同的方法来优化文件访问 .
您的第一个扩展问题是如何跨多个磁盘管理文件集 . 只是将单个文件系统扩展到许多磁盘上是一个坏主意 . 如果你有很多目录,那么你可以有很多挂载点 . 但是当你得到数据的数据时,这并不是那么好用 .
但是,内容的索引与文件存储无关,这意味着您现在为文件存储选择的内容并不重要,因为您可以在以后轻松更改文件到位置的映射,而无需移动现有数据集 .