Php-PRO和CON用于流媒体VS写入/缓存


Php - PRO and CON for streaming VS. writing /caching

我多次遇到这种困境,我想一劳永逸地调整我脑海中的答案。

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

  • 写入磁盘。

  • 带有标题的流可直接下载。

需要考虑的是:

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

一个实际的例子:

假设我有一个网站可以下载一个装满图片的zip。

如果我流式传输zip,显然会耗费CPU(和时间)。

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

如果我写入磁盘,我还需要以某种方式检查zip中的文件是否应该更新,此外,我还必须验证文件的完整性。

无论如何,我想听听人们对在什么情况下哪种方法是首选方法、对此有什么最佳实践或任何其他见解有什么看法。

如果做对了,安全性就不重要了。只是不要将文件存储在公共webroot中,或者以其他方式将您的web服务器配置为不直接提供这些文件。

有了这些,这取决于你想要什么。如果您需要一次又一次地提供相同的zip,当然,将其压缩一次并将其写入磁盘是有意义的,下次将从磁盘提供。这是一个简单的缓存策略
如果你需要确保你有最新版本的zip,可以用某种方式对内容进行散列。例如:

  1. 压缩(foo.txt, bar.jpg, baz.doc)的文件列表
  2. 生成哈希$hash = md5(foo.txt, bar.jpg, baz.doc)
  3. 如果$hash.zip还不存在,请创建它
  4. 服务$hash.zip

这是一种典型的缓存策略,可以避免一次又一次地执行代价高昂的操作。

如果同一个相同的zip文件将被多次下载,则将其缓存(在磁盘或其他持久存储上)是有意义的。如果您将zip内容的散列作为文件名(或缓存数据的任何标识符)的一部分,那么查看缓存的值是否与您想要提供的值匹配就很简单了。

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