多个小目录或一个大目录,文件命名 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_picstable
和 lowq 文件 使用 '/pictures/low/'.$src_of_picstable
出于两个原因,我不建议使用单一目录方法。首先,如果您计划拥有大量图像,您的目录将会变得非常大。手动搜索单个图像将花费更长的时间。当您调试某些东西或测试新功能时,这将是必需的。
多个目录的第二个原因是您可以对部分图库进行较小的备份。如果你有非常大的画廊(比如说几 TB),单个硬盘驱动器可能不足以容纳所有这些。使用多个目录,您可以将每个目录安装在单独的硬盘驱动器上,这样可以处理几乎无限大小的图库。
我最喜欢的方法是 YYYY/MM/type-of-image 目录结构。这样你就可以通过逐月查看来发现你什么时候引入了一些错误。您还可以进行每月备份而无需复制冗余文件。还制作所有画廊的季度快照以防万一。
关于图像类型,我可能需要几种类型的图像,例如原始图像、小缩略图、缩略图、普通图像等。这样我就可以交换图像类型并获得不同的图像尺寸。
至于你,我会建议 YYYY/MM/type-of-image/user_id 方法,你可以在一个地方轻松找到所有用户上传的文件。
正确回答问题的方法是测试它。
哪个更快取决于文件数量和底层文件系统; ext3,4 将非常乐意处理单个目录中的大量文件(在 HTree 索引中管理的目录 atr)。一些文件系统只使用简单的列表。其他人有不同的优化文件访问的方法。
缩放的第一个问题是如何跨多个磁盘管理文件集。仅仅将单个文件系统扩展到大量磁盘并不是一个好主意。如果您有很多目录,那么您可以有很多挂载点。但是,当您获得数 TB 的数据时,这并不能很好地工作。
然而,内容 索引 独立于文件存储意味着您现在为文件存储选择什么并不重要,因为您可以轻松更改稍后将文件移动到某个位置,而无需移动现有数据集。
这是一个完全理论的问题。
我有一个照片存储网站,其中的照片由在该网站注册的用户上传。
问题
- 哪种方法更快?
- 当我需要使用大量电脑时,从长远来看会更好 硬盘?
- 有没有其他更好的方法?
现在我想到了完成这些东西的两种方法。
上传到我服务器的文件预计会很大~>1亿
方法一
这两个/pictures/hd/
& /pictures/low/
目录将包含用户上传的所有文件。
$newfilename = $user_id.time().$filename; //$filename = actual filename of uploaded file
$src = '/pictures/hd/'.$newfilename; //for hd pics
通过
将其插入 mysqlinsert 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
通过
将其插入 mysqlinsert into pics(`user_id`,`src`)VALUES('$user_id','$newfilename')
检索
检索图像时,我可以使用 pics
table 的 src
列来获取文件名并浏览 hd 文件使用 '/pictures/hd/'.$src_of_picstable
和 lowq 文件 使用 '/pictures/low/'.$src_of_picstable
出于两个原因,我不建议使用单一目录方法。首先,如果您计划拥有大量图像,您的目录将会变得非常大。手动搜索单个图像将花费更长的时间。当您调试某些东西或测试新功能时,这将是必需的。
多个目录的第二个原因是您可以对部分图库进行较小的备份。如果你有非常大的画廊(比如说几 TB),单个硬盘驱动器可能不足以容纳所有这些。使用多个目录,您可以将每个目录安装在单独的硬盘驱动器上,这样可以处理几乎无限大小的图库。
我最喜欢的方法是 YYYY/MM/type-of-image 目录结构。这样你就可以通过逐月查看来发现你什么时候引入了一些错误。您还可以进行每月备份而无需复制冗余文件。还制作所有画廊的季度快照以防万一。
关于图像类型,我可能需要几种类型的图像,例如原始图像、小缩略图、缩略图、普通图像等。这样我就可以交换图像类型并获得不同的图像尺寸。
至于你,我会建议 YYYY/MM/type-of-image/user_id 方法,你可以在一个地方轻松找到所有用户上传的文件。
正确回答问题的方法是测试它。
哪个更快取决于文件数量和底层文件系统; ext3,4 将非常乐意处理单个目录中的大量文件(在 HTree 索引中管理的目录 atr)。一些文件系统只使用简单的列表。其他人有不同的优化文件访问的方法。
缩放的第一个问题是如何跨多个磁盘管理文件集。仅仅将单个文件系统扩展到大量磁盘并不是一个好主意。如果您有很多目录,那么您可以有很多挂载点。但是,当您获得数 TB 的数据时,这并不能很好地工作。
然而,内容 索引 独立于文件存储意味着您现在为文件存储选择什么并不重要,因为您可以轻松更改稍后将文件移动到某个位置,而无需移动现有数据集。