Php - PRO和CON用于流式传输VS.写/缓存

时间:2012-03-29 02:08:50

标签: php caching streaming download filestream

我多次陷入这种困境 - 我希望有一次能够在我脑海中调整答案。

使用PHP创建文件时,如* .zip,* pdf或任何其他文件,PHP将为您提供两个操作选项:

  • 写入磁盘。

  • 带标题的流直接下载。

需要考虑的事项是:

  • 安全(通常)
  • 文件的CPU和服务时间
  • 文件完整性
  • 文件更新
  • 我没有列出的任何其他考虑因素。

一个实际的例子:

假设我有一个网站下载带图片的打包拉链。

如果我流式传输拉链 - 显然会花费CPU(和时间)。

如果我写入磁盘 - 可能是安全问题(假设有人可以“抓取”网站,以某种方式找到zip文件夹或文件,并批量下载所有内容)

如果我写入磁盘,我还需要检查zip中的文件是否应该更新,而且我必须验证文件的完整性。

无论如何 - 我想听听人们有什么说法,哪种方式是首选方法,在哪种情况下,最佳做法是什么,或任何其他见解。

2 个答案:

答案 0 :(得分:1)

如果要多次下载相同的zip文件,则将其缓存(在磁盘或其他一些持久存储上)是有意义的。如果你将zip的内容的哈希作为文件名的一部分(或者你在下面缓存数据的任何标识符),那么查看你的缓存值是否与你想要的服务相匹配是微不足道的。

如果任何给定的zip文件只下载一次,那么直接流式传输更有意义。

答案 1 :(得分:1)

如果你做得不错,安全无关紧要 。只是不要将文件存储在公共webroot中,或者将Web服务器配置为不直接提供这些文件。

除此之外,它取决于你想要什么。如果你需要一次又一次地提供相同的拉链,当然拉链一次并将其写入磁盘是有意义的,下次你将在那里服务它。这是一个简单的缓存策略 如果您需要确保拥有最新版本的zip,请以某种方式对内容进行哈希处理。例如:

  1. 要压缩的文件列表(foo.txt, bar.jpg, baz.doc)
  2. make hash $hash = md5(foo.txt, bar.jpg, baz.doc)
  3. 如果$hash.zip尚不存在,请创建
  4. 投放$hash.zip
  5. 这是一种典型的缓存策略,可以避免一次又一次地进行昂贵的操作。