【问题标题】:Is downloading file through PHP or through direct link faster?是通过 PHP 还是通过直接链接下载文件更快?
【发布时间】:2012-01-24 08:26:18
【问题描述】:

我需要让用户下载一些文件(例如 PDF)。什么会更长:

  • 通过 PHP 发送此文件(带有特定的标头),
  • 或者把它放在http public 文件夹中,并让用户下载它的公共链接(无需PHP帮助)?

在第一种情况下,原始文件可能位于私有区域。 但我认为通过 PHP 发送此文件需要一些时间。

那么我如何衡量 PHP 发送文件所花费的时间以及它可以消耗多少内存?

附:在第一种情况下,当 PHP 发送标头和浏览器(如果安装了 pdf 插件)将尝试在浏览器中打开它,PHP 是否仍在工作,或者它在立即发送标头后推出整个文件?或者如果没有安装插件并且浏览器将显示“另存为”对话框 PHP 仍在工作?

【问题讨论】:

  • PHP 在其中任何一个上花费的时间都可以忽略不计。会有所不同的是您和客户的网络连接。换句话说:您不必测量时间。只需实施一种解决方案。
  • 如果 PHP 将发送文件,并且用户将查看“另存为”对话框并决定做什么,PHP 将等待用户回答?内存将被使用?直到用户决定点击保存或取消,对吧?

标签: php performance pdf


【解决方案1】:

您使用 PHP 的主要问题是它消耗的内存 - 每个链接都会创建一个新进程,这可能是 8M - 20M,具体取决于您的脚本做什么,是否使用框架等。

出于兴趣,我编写了一个 symfony 应用程序来提供下载,并执行并发限制、带宽限制等操作。如果您有兴趣查看代码,请联系 here。 (我本身并没有获得许可,但如果你愿意,我很乐意将其设为 GPL3)。

【讨论】:

  • 这是我关心的问题。如果 1K 人会尝试打开每个自己的文件怎么办?如果文件将由 Apache 单独发送,似乎内存消耗会更少。
  • 正确。一般来说,如果你想做一些花哨的事情,比如并发限制,你应该只使用脚本化的过程(如果你使用正确的可选模块,甚至可以由 Apache 完成)。如果您只想提供基于密码/会话的安全性,那么您可以创建不可猜测的目录结构(可能包括哈希)并创建从该结构内部到 Web 树外部真实文件的符号链接。一个 cron-job 可以用来删除过期的文件夹。
  • 附注:如果您的 PHP 进程占用 16M,那么 1000 个并发用户将占用大约 16G 的 RAM - 如果您有自己的服务器,这很好。但是,当然,您可以限制您的系统在繁忙时段拒绝对过多用户的请求。最后,值得做一些研究,看看你可以合理地得到什么级别的请求:大多数网站受欢迎程度的预测都被高估了,imo。
【解决方案2】:

如果您担心下载速度,它将很少。

我想这取决于您的文件有多大,您希望有多少下载,以及您的文档是否应该可以公开访问,以及客户端的下载速度。

【讨论】:

  • 这里主要关注的是内存使用情况。我认为单个 Apache 会比 Apache + PHP 消耗更少的内存。即使用户会在“另存为”对话框中考虑要做什么,PHP 似乎也会保留已用过的内存。你怎么看?
  • 是的,php 可能会使用更多内存。将文件作为静态文件提供我个人认为将是最有益且最容易实现的。
猜你喜欢
  • 2017-09-11
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 2022-12-21
相关资源
最近更新 更多