首页 文章

多个小目录或一个巨大的目录,文件命名为php mysql

提问于
浏览
0

这是一个完全理论化的问题 .

我有一个照片存储网站,其中照片由网站上注册的用户上传 .

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 回答

  • 0

    我不建议单目录方法有两个原因 . 首先,如果您计划拥有大量图像,那么您的目录将变得非常大 . 手动搜索单个图像需要更长的时间 . 在调试测试新功能时需要这样做 .

    多个目录的第二个原因是您可以对图库的一部分进行较小的备份 . 如果你有一个非常大的画廊(比方说几兆兆字节)单个硬盘驱动器可能不足以容纳它们 . 使用多个目录,您可以将每个目录安装在单独的硬盘驱动器上,这样处理几乎无限大小的库 .

    我最喜欢的方法是YYYY / MM /图像类型目录结构 . 通过这种方式,您可以通过逐月查看来确定何时引入了一些错误 . 此外,您可以进行每月备份而无需复制冗余文件 . 同时制作所有图库的季度快照以防万一 .

    关于图像类型,我可能需要几种类型的图像,如原始图像,小缩略图,缩略图,普通图像等 . 这样我只需交换图像类型并获得不同的图像大小 .

    至于你我会建议YYYY / MM / type-of-image / user_id方法,你可以在一个地方轻松找到所有用户上传的文件 .

  • 0

    回答问题的正确方法是测试它 .

    哪个更快将取决于文件的数量和underlyng文件系统; ext3,4将很乐意处理单个目录中的大量文件(dentry atr在HTree索引中管理) . 有些文件系统只使用简单列表 . 其他人有不同的方法来优化文件访问 .

    您的第一个扩展问题是如何跨多个磁盘管理文件集 . 只是将单个文件系统扩展到许多磁盘上是一个坏主意 . 如果你有很多目录,那么你可以有很多挂载点 . 但是当你得到数据的数据时,这并不是那么好用 .

    但是,内容的索引与文件存储无关,这意味着您现在为文件存储选择的内容并不重要,因为您可以在以后轻松更改文件到位置的映射,而无需移动现有数据集 .

相关问题