因此,我的托管服务在我的服务器(索引节点)上有一个INODES限制。每个目录/文件= 1 INODE。这可能是将来的问题,因为我想在我的网站中实现文件共享。理论上我不能将文件数据存储到MySQL数据库中,然后在用户请求下载时提取数据吗?如果可以,我将如何在PHP中执行此操作?
MySQL Skeleton:
TABLE: Files
ROWS: id, filename, data
答案 0 :(得分:3)
由于这样的限制,不要开始在数据库 中存储内容 - 这种方法存在严重的缺点。
如果您确实希望您的号码超过提供商允许的数量,请更改提供商和/或租用私人服务器。
这个着名的SO问题中讨论过的大多数事情都是:
Storing Images in DB - Yea or Nay?
适用于所有文件格式。
答案 1 :(得分:0)
首先,我建议寻找其他托管服务提供商。
但如果那不可能,那就可以实现它了(我已经看过它在perl中完成,但PHP应该没有太大的不同) 我不会讨论在DB中使用这些文件的优点,因为它们不适用于您的情况(但是,尽管您之前的答案会有所考虑,但仍有一些)
您将需要两个表,一个表用于存储元数据,例如文件名,大小和您需要的其他数据,以及一个用于实际内容的表。对于元数据,我将把实现留给您。
存储内容的表格有点有趣,所以我将提供一些细节。
字段: 写到FileID, 块, DataChunk(Blob)
主键将通过FileID和Chunk,Chunk设置为自动增量。这将增加Chunk的相同文件ID。当文件大小超过1Mb时,将整个文件存储在单个blob中是不可行的。此外,它有助于分片(在您的情况下不适用)。
在插入时,您需要将文件拆分为适当大小的块,适当地转义数据,并在数据库中逐个插入。
在输出时,您需要以正确的顺序提取块,连接它们并将它们保存在磁盘上。然后使用重定向使Apache直接提供它。您可以使用它在磁盘上有一个小缓存(尊重inode限制)。检查文件是否已在磁盘上,如果是,则跳过整个数据库提取。