2012-08-31 49 views
5

我的主要原因是通过不同的选项获得意见。我有一个目录中的文件/大拇指与视频相关,当我必须让他们使用glob()函数glob(DIRECTORY./file_name*.jpg);并返回视频的所有JPG文件的数组。PHP - 阅读目录与从数据库中读取

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

如果有更好的选择,请让我知道。

谢谢。

+0

考虑到一次有50多个用户在线。 – ArslanCb

+0

这个问题的核心问题似乎是你“关注使用”,但并不清楚你的意思。请更清楚地解释与您有关的问题,以便我们提供帮助。在你看来,你现在这样做的问题究竟是什么? –

+0

谢谢Nate。是的,我主要关心的是CPU /内存,或者你可以说性能。哪个选项更好。 – ArslanCb

回答

6

像往常一样的性能问题,结果可能会有所不同,所以答案是:什么是更快的速度为

开始的地方是衡量您现在正在做的事情需要多少时间才能完成。一旦你完成了这些,问问自己:这足够快吗?这可能是因为,尽管它可能不是最快的做法,但速度仍然非常快,所以速度不是问题。

处理页面花费多少时间来获取文件大小? 1%? 10%? 50%?这个比例越高,就越有必要考虑改变你做事的方式。

另外,网站整体性能如何?如果您将每页加载的速度加倍,人们会注意到吗?如果没有,那么即使你看到明显的地方这样做,也可能不值得进行性能调整。

如果您认为自己可以做得更好,请使用数据库实现功能并测量其速度。再次,结果与此可能是高度可变的。例如,如果您的数据库处于沉重负载下,从数据库获取结果可能会慢得多。如果你有一个几乎没有使用的强大的数据库,它可能会非常快。只有测试才能告诉你事实。

我会补充一点,你现在做事情的方式现在看起来更简单和更易维护,因为它会根据磁盘上的实际文件找到文件名。如果您尝试使用数据库,则必须担心将数据库中的文件名列表与文件系统中的文件列表同步。

但是,有一点需要注意的是,当您拥有一个包含大量文件的单个目录时,许多文件系统的性能会更差。如果您遇到这种情况,请考虑将文件分成多个子目录。一种流行的方法是制作名称为az的目录,然后将所有以“a”开头的文件放在“a”目录中,所有以“b”开头的文件放在“b”目录中等等。但是,这可能只是一旦你有成千上万的文件,这很重要,即使如此,它依赖于特定的文件系统和运行的硬件。

(编辑基于评论:)

既然你是在谈论预先计算的结果和存储那些在数据库中,我认为不是把东西在数据库中的更好的方法是使用一个缓存服务器像http://memcached.org/。您可以将其视为一种混合方法:您现在仍然按照现在的方式执行操作,但每次需要结果时,首先检查缓存是否包含结果;如果是,则使用缓存的结果,否则计算新的glob。这样可以避免数据库和文件系统保持同步的问题,因为旧的缓存条目可能会过期并被新的正确的条目取代。

+0

谢谢我现在会进行一项测试,它将在本地环境中进行,因此结果可能会有所不同,但在我上线之前仍然是一个很好的做法。 – ArslanCb

+0

文件名是唯一的,拇指文件就像是文件名1.jpg,文件名-2.jpg,文件名-3.jpg等等,每个视频可以有1到30个大拇指。我正在考虑使用数据库,因为一旦保存了数据,我不必每次都使用glob。只是重新使用已保存的数据,并结合使用json(ed)数组可以更快... – ArslanCb

+0

我明白你的意思了。这本质上更快,因为结果是为您预先计算的。不过,我建议使用像memcached这样的缓存服务器,它更适合这种用途。 –

0

如果您已经将视频本身的信息存储在数据库中,则可以考虑在保存视频数据的表中存储每个视频的拇指数。这要比查询完整文件名的单独表格要快得多,因为您只需引用已经查询过的记录中的字段。这可能是你现在的两个想法之间的一个很好的折中。但是,您必须确保拇指的名称一致且可编程。例如,只有视频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 
+0

谢谢你,但拇指有不同的大小,用户也可以上传自定义的拇指和删除现有的,文件名基本上是拇指的前缀。大拇指也可以有名称像文件名-300x240-2.jpg 我的旧代码只使用增量,我存储的数字,但现在它的小不仅仅是一个增量。谢谢你的建议,我现在正在存储一个json(ed)数组,并且我认为它可以达到目的。 S.O拥有出色的人员和优秀的社区。 – ArslanCb