我多次遇到这种困境,我想一劳永逸地调整我脑海中的答案。
当使用PHP创建文件时,如*.zip、*pdf或任何其他文件,PHP将为您提供两个操作选项:
-
写入磁盘。
-
带有标题的流可直接下载。
需要考虑的是:
- 安全(通常)
- 文件的CPU和服务时间
- 文件完整性
- 文件更新
- 我没有列出的任何其他考虑因素
一个实际的例子:
假设我有一个网站可以下载一个装满图片的zip。
如果我流式传输zip,显然会耗费CPU(和时间)。
如果我写到磁盘上,这可能是安全问题(假设有人可以"抓取"网站,以某种方式找到zip文件夹或文件,并批量下载所有文件)
如果我写入磁盘,我还需要以某种方式检查zip中的文件是否应该更新,此外,我还必须验证文件的完整性。
无论如何,我想听听人们对在什么情况下哪种方法是首选方法、对此有什么最佳实践或任何其他见解有什么看法。
如果做对了,安全性就不重要了。只是不要将文件存储在公共webroot中,或者以其他方式将您的web服务器配置为不直接提供这些文件。
有了这些,这取决于你想要什么。如果您需要一次又一次地提供相同的zip,当然,将其压缩一次并将其写入磁盘是有意义的,下次将从磁盘提供。这是一个简单的缓存策略
如果你需要确保你有最新版本的zip,可以用某种方式对内容进行散列。例如:
- 压缩
(foo.txt, bar.jpg, baz.doc)
的文件列表 - 生成哈希
$hash = md5(foo.txt, bar.jpg, baz.doc)
- 如果
$hash.zip
还不存在,请创建它 - 服务
$hash.zip
这是一种典型的缓存策略,可以避免一次又一次地执行代价高昂的操作。
如果同一个相同的zip文件将被多次下载,则将其缓存(在磁盘或其他持久存储上)是有意义的。如果您将zip内容的散列作为文件名(或缓存数据的任何标识符)的一部分,那么查看缓存的值是否与您想要提供的值匹配就很简单了。
如果任何给定的zip文件只下载一次,那么直接流式传输更有意义。