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

Multiple Small Directories Or One Huge Directory with file naming php mysql

这是一个完全理论的问题。

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

问题

现在我想到了完成这些东西的两种方法

上传到我服务器的文件预计会很大~>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')

方法二

这两个/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')

检索

检索图像时,我可以使用 pics table 的 src 列来获取文件名并浏览 hd 文件使用 '/pictures/hd/'.$src_of_picstablelowq 文件 使用 '/pictures/low/'.$src_of_picstable

出于两个原因,我不建议使用单一目录方法。首先,如果您计划拥有大量图像,您的目录将会变得非常大。手动搜索单个图像将花费更长的时间。当您调试某些东西或测试新功能时,这将是必需的。

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

我最喜欢的方法是 YYYY/MM/type-of-image 目录结构。这样你就可以通过逐月查看来发现你什么时候引入了一些错误。您还可以进行每月备份而无需复制冗余文件。还制作所有画廊的季度快照以防万一。

关于图像类型,我可能需要几种类型的图像,例如原始图像、小缩略图、缩略图、普通图像等。这样我就可以交换图像类型并获得不同的图像尺寸。

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

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

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

缩放的第一个问题是如何跨多个磁盘管理文件集。仅仅将单个文件系统扩展到大量磁盘并不是一个好主意。如果您有很多目录,那么您可以有很多挂载点。但是,当您获得数 TB 的数据时,这并不能很好地工作。

然而,内容 索引 独立于文件存储意味着您现在为文件存储选择什么并不重要,因为您可以轻松更改稍后将文件移动到某个位置,而无需移动现有数据集。