2013-04-27 189 views
2

我有一个PHP应用程序,它从用户获取对象并将它们存储在服务器上。类似于上传下载服务。对象可以从一串文本到任何类型的媒体对象(如电影,歌曲等)而变化。即使发送简单文本,发送文本的大小也可能很大(可能是整个电子书)。目前,我这样做的方式是将所有这些数据写入文件,因为文件不会强加大小限制。数据大小没有限制时的有效数据存储

编辑:为了澄清,我正在寻找一种通用和有效的方式来存储数据,无论格式如何。例如,用户可以发送字符串“嗨,我是XYZ”。我可以使用像“fopen”,“fwrite”这样的文件操作来存储它。如果用户发送MP3文件,我可以再次使用“fwrite”,文件的数据将按原样写入,并且MP3格式不受干扰。这目前完美运作,没有问题。所以“fwrite”是我的通用接口。

我的问题:是否有一些更好,有效的方法来做到这一点?

感谢您的帮助!

+0

你必须存储它们,并存储你必须把它放在一个文件中(或保存在RAM中,并希望电源不会熄灭)。我不明白这个问题,你需要帮助选择一个压缩算法?例如ZIP以不同的方式处理不同的格式。 – rath 2013-04-27 19:11:05

+0

@rath,我编辑了这个问题,现在清楚了吗? – 2013-04-27 19:16:57

+0

是的,谢谢。也许你可以在一次调用中做一个'file_put_contents',它几乎是一个'fopen','fwrite'和'fclose' – rath 2013-04-27 19:21:02

回答

2

这个问题的答案很复杂。您绝对可以将这些对象作为LONGBLOB对象存储在数据库中 - 除非您正在进入特征长度电影领域(大小限制为32位)。

更重要的问题是如何让对象回到用户。一个“blob”对象在返回结果(它来自单行查询)时不会给你太多的灵活性。从文件系统中读取可能会提供更大的灵活性(例如,检索文本文件的一部分以查看内容)。

另一个问题是备份和恢复。将对象存储在数据库中将大大增加数据库的大小,需要更多的时间来恢复数据库。在发生问题时,您可能很高兴能够在数据库实际访问对象之前将数据库备份(用户可以看到他们拥有哪些对象)。

另一方面,将数据库和对象映射到备份服务器可能会比较方便。或者,如果您使用复制来保持多个版本同步,那么将所有数据存储在数据库中都会免费(假设您在两台服务器之间有高带宽连接)。

就我个人而言,我倾向于认为这样的对象更适合文件系统。这确实需要为应用程序提供更复杂的API,它必须从两个不同的地方获取数据。

+0

非常感谢你。我没有听说过LONGBLOB和LONGTEXT。看起来像是我的案例的完美解决方案。是的,如果文件太大,则最好将它们存储在文件系统中,并将指针存储在数据库中。但是对于我的产品的大多数用例来说,LONGBLOB实际上对某个特定的点很好,所以它会节省很多文件操作!谢谢!! – 2013-04-27 19:28:08

+0

@sanjeevmk。 。 。我很高兴这有帮助。干杯。 – 2013-04-27 19:32:15

0

将文件存储到文件系统并不是坏方法,直到文件系统对每个目录计数文件大小没有限制。在很多服务器上同步它也很困难。 在这种情况下,你可以使用某种虚拟fs(如mongo gridFS