PHP-读取目录与从数据库获取


PHP - Reading Directory vs Fetching from Database

我的主要原因是对不同的选项有意见。我在一个与视频相关的目录中有文件/拇指,当我必须获取它们时,我会使用glob()函数glob。(directory./file_name*.jpg);并且它返回视频的所有JPG文件的阵列。

glob函数本身很快,但我仍然担心使用情况,因为每个页面上可能有20到50个视频,所以会有20到50glob调用,我应该继续使用它,还是开始将数据放入数据库,从那里获取文件列表,而不是glob()?

如果有更好的选择,请告诉我。

谢谢。

与通常的性能问题一样,结果可能会有很大的差异,所以答案是:对您来说,越快越好

开始的地方是衡量你现在做事情需要多少时间。一旦你做到了,问问自己:这够快吗?这可能是因为,尽管这可能不是最快的做事方式,但它仍然如此之快,速度并不令人担忧。

处理一个页面花了多少时间来获取文件globs?1%?10%?50%?这个百分比越高,就越值得考虑改变你做事的方式。

此外,网站整体表现如何?如果你把每个页面的加载速度提高一倍,人们会注意到吗?如果没有,那么它可能还不值得做性能调优,即使你看到了这样做的明显地方

如果您认为可以做得更好,请使用数据库实现功能,并衡量是否更快。同样,这样做的结果可能是高度可变的。例如,如果您的数据库负载过重,则从数据库中获取结果的速度可能会慢得多。如果你有一个功能强大、几乎不用的数据库,它可能会非常快。只有测试才能告诉你真相。

我要补充的是,您现在的操作方式似乎更简单、更易于维护,因为它可以根据磁盘上的实际文件查找文件名。如果您尝试使用数据库,您将不得不担心将数据库中的文件名列表与文件系统中的文件列表同步。

不过,需要注意的一点是,当一个目录中有大量文件时,许多文件系统的性能会更差。如果出现这种情况,请考虑将文件拆分为多个子目录。一种流行的方法是创建名为A-z的目录,然后将所有以"A"开头的文件放在"A"目录中,将所有以"b"开头的文件都放在"b"目录中,等等。然而,这可能只有在拥有数万个文件时才重要,即使这样,这也取决于特定的文件系统及其运行的硬件。

(根据评论进行编辑:)

既然您谈论的是预计算结果并将其存储在数据库中,我建议比将结果放入数据库更好的方法是使用缓存服务器http://memcached.org/.你可以将其视为一种混合方法:你仍然按照现在的方式做事,但每次你想要一个结果时,你都会首先检查缓存,看看它是否包含结果;如果是,则使用缓存的结果,否则计算新的glob。这避免了保持数据库和文件系统同步的问题,因为旧的缓存项可能会过期并被新的、正确的缓存项替换。

如果您已经将视频本身的信息存储在数据库中,则可以考虑在保存视频数据的表中只存储每个视频的拇指数。这将比查询一个完整文件名的单独表快得多,因为您只需要引用已经查询过的记录中的字段。这可能是你目前两种想法之间的一个很好的妥协。然而,你必须确保你拇指的名字是一致的和可编程的。例如,假设只有视频123有4个拇指,您可以生成:

/path/to/video_123/thumb_01.jpg
/path/to/video_123/thumb_02.jpg
/path/to/video_123/thumb_03.jpg
/path/to/video_123/thumb_04.jpg