处理此问题的最佳方法是:在完全下载文件之前,通过PHP +大量下载来自客户端=脚本超时的慢速连接

Chr*_*oom 11 php connection timeout tracking download

我的客户想要一种向用户提供下载的方法,但只有在他们填写注册表(基本上是姓名和电子邮件)之后.通过可下载内容的链接向用户发送电子邮件.链接包含对包,文件和用户唯一的注册哈希,它们实际上转到记录每次下载的PHP页面,并通过将文件写入stdout(以及相应的头文件)将文件推出.此解决方案具有固有的缺陷,但这就是他们想要这样做的方式.需要说的是,我努力推动他们1.)限制可下载文件的大小和2.)考虑使用CDN(他们有国际客户,但托管在美国在2个镜像服务器和使用粘性IP的负载均衡器上.无论如何,它"适合我" 但他们的一些国际客户的连接速度很慢(d/l速率约为60kB /秒),其中一些文件相当大(150 MB).由于这是一个提供这些文件的PHP脚本,因此它受脚本超时设置的约束.起初我把它设置为300秒(5分钟),但这对于一些测试版用户来说还不够.所以我尝试根据文件大小除以100kb /秒连接计算脚本超时,但其中一些用户甚至比这慢.

现在客户端想要提升超时值.如果脚本以某种方式进入无限循环,我不想一起删除超时.我也不想为了一些全能最低公分母连接速率而任意推出超时(大多数人的下载速度比100kb /秒快得多).而且我也希望能够在某个时候告诉客户"看,这些文件太大而无法以这种方式处理.您正在通过这些40多分钟的连接影响网站其余部分的性能.我们要么需要重新考虑如何交付或使用更小的文件."

我有几个解决方案,如下:

  1. CDN - 将文件移动到CDN服务,如亚马逊或谷歌.我们仍然可以通过PHP文件记录下载尝试,但随后将浏览器重定向到真实文件.这样做的一个缺点是,一旦用户拥有URL(可以通过观察HTTP头部收集),用户可以绕过脚本并直接从CDN下载.这不错,但不是很理想.
  2. 展开服务器场 - 将服务器场从2个服务器场扩展到4个以上,并从负载平衡器中删除粘性IP规则.缺点:这些是Windows服务器,因此价格昂贵.他们没有理由不能成为Linux盒子,但是设置所有新盒子可能需要比客户端允许的时间更长的时间.
  3. 设置2个新服务器严格用于提供这些下载 - 基本上与#2相同的优点和缺点,除了我们至少可以隔离网络的其余部分(并微调新服务器)这个特定的过程.我们也很容易制作这些Linux盒子.
  4. 检测用户连接速率 - 我想到了一种方法,通过在下载登录页面上使用AJAX来检测用户的当前速度,以计​​算下载具有已知文件大小的静态文件所需的时间,然后将该信息发送到服务器并根据该信息计算超时.它并不理想,但它比估计连接速度太高或太低都要好.我不确定如何将速度信息返回到服务器,因为我们当前使用从服务器发送的重定向标头.

#1-3的机会将被拒绝或至少被推迟.4这是一个很好的方法来解决这个问题,还是有其他我没有考虑过的问题?

(随意挑战原始解决方案.)

Eve*_*ert 4

使用 X-SENDFILE。大多数网络服务器本身或通过插件(apache)支持它。

使用此标头,您可以简单地指定本地文件路径并退出 PHP 脚本。网络服务器看到标头并提供该文件。