【问题标题】:PHP - Reading Directory vs Fetching from DatabasePHP - 读取目录与从数据库中获取
【发布时间】:2012-08-26 07:34:52
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 考虑到有 50 多个用户同时在线。
  • 这个问题的核心问题似乎是你“关心使用”,但不清楚你的意思。请更清楚地解释您关心的问题,以便我们提供帮助。在您看来,您现在这样做的方式到底有什么问题?
  • 谢谢内特。是的,我主要关心的是 CPU/内存,或者你可以说性能。哪个选项更好。

标签: php database memory directory glob


【解决方案1】:

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

开始的地方是衡量你现在正在做的事情需要多少时间。完成此操作后,问问自己:这是否足够快?可能是,虽然它可能不是最快的做事方式,但它仍然如此之快,以至于速度不是问题。

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

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

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

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

需要注意的一点是,当您拥有一个包含大量文件的目录时,许多文件系统的性能会更差。如果您遇到这种情况,请考虑将文件拆分为多个子目录。一种流行的方法是创建名称为 az 的目录,然后将所有以“a”开头的文件放在“a”目录中,将所有以“b”开头的文件放在“b”目录中,等等。但是,这可能只是一旦您拥有数以万计的文件,这很重要,即使那样,它也取决于特定的文件系统及其运行的硬件。

(根据cmets编辑:)

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

【讨论】:

  • 谢谢,我现在将进行测试,它将在本地环境中进行,因此结果可能会有所不同,但在我上线之前仍然是一个好习惯。
  • 文件名是唯一的,拇指文件有 filename-1.jpg、filename-2.jpg、filename-3.jpg 等,每个视频可以有 1 到 30 个拇指。我正在考虑使用数据库,因为一旦保存了数据,我就不必每次都进行 glob。只需重新使用已经保存的数据,并结合 json(ed) 数组,事情可以更快......
  • 我明白你的意思。这本质上更快,因为结果是为您预先计算的。不过,我建议不要使用数据库,而是使用像 memcached 这样的缓存服务器,它更适合这种用途。
  • 我正在使用过时的文件夹。 /thumbs/2012/8/31/filename-1.jpg 等等...我编写代码以使用 json 和数据库,因此我可以将所有文件名存储在一个字段中。我可以使用 memcache,但我必须编写一个适合大多数服务器环境的代码,因为我的代码是开源的(ClipBucket),而且没有多少人非常了解缓存和其他东西,所以这就是我担心内存的原因。再次感谢您的建议。谢谢。
【解决方案2】:

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

【讨论】:

  • 谢谢你,但拇指也有不同的大小,用户也可以上传自定义拇指并删除现有的,文件名基本上是拇指的前缀。 thumbs 也可以有像 filename-300x240-2.jpg 这样的名称我的旧代码只使用增量,我存储了数字,但现在它不仅仅是一个增量。感谢您的建议,我现在正在存储一个 json(ed) 数组,我认为它可以达到目的。 S.O 有很棒的人和很棒的社区。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2016-01-25
  • 2016-11-16
  • 2016-10-29
相关资源
最近更新 更多