Php-流式处理与写入/缓存的优缺点

Php-流式处理与写入/缓存的优缺点,php,caching,streaming,download,filestream,Php,Caching,Streaming,Download,Filestream,我有过很多次这样的两难选择——我希望有一次能彻底地调整我头脑中的答案 使用PHP创建文件时,如*.zip、*pdf或任何其他文件,PHP将为您提供两个操作选项: 写入磁盘 流与标题直接下载 需要考虑的事情是: 安全(通常) 文件的CPU和服务时间 文件完整性 文件更新 我没有列出的任何其他考虑因素 一个实际例子: 比如说,我有一个网站可以下载一个压缩的图片 如果我流式传输zip,显然会花费CPU(和时间) 如果我写到磁盘,这可能是安全问题(假设有人可以“爬网”网站,以某种方式找到zip文

我有过很多次这样的两难选择——我希望有一次能彻底地调整我头脑中的答案

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

  • 写入磁盘

  • 流与标题直接下载

需要考虑的事情是:

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

比如说,我有一个网站可以下载一个压缩的图片

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

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

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


无论如何-我想听听人们对在什么情况下哪种方法是首选方法的看法,这方面的最佳实践是什么,或者其他见解。

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

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

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

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

  • zip
    文件列表(foo.txt、bar.jpg、baz.doc)
  • 使hash
    $hash=md5(foo.txt、bar.jpg、baz.doc)
  • 如果
    $hash.zip
    不存在,请创建它
  • 服务
    $hash.zip

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

    Ok-但如果文件是相同的,例如,但它只需要不同的名称(如追加用户名或日期),会被视为“一次性下载”吗?那么缓存时的安全性呢?你看-我已经学到了一些东西-我愚蠢到使用了内部CRC-这要求每次打开文件都要消耗CPU。我想,使用散列来附加到文件名会更经济。你能详细说明一下关于安全性的“正确操作”部分吗?我应该考虑什么?只是不要公开访问文件。仅仅因为您正在将其写入磁盘并不意味着任何人都可以下载它。只有将其写入可公开访问的webroot中的磁盘时,才会出现这种情况。您只需将其写入webroot之外的磁盘,问题就解决了。在每个具有正确访问权限的人都可以自由下载所有文件的情况下,这是正确的。但如果我需要以文件对文件的方式限制下载,该怎么办?仅仅在许可证上提供一个链接并不能解决这个问题(除非我遗漏了什么)。有很多解决方案可以用于授权文件下载。请搜索它。选项1:使用PHP进行授权,并使用
    readfile()
    提供文件。选项2:Apache的modxsendfile。