gpt4 book ai didi

php - 处理此 : large download via PHP + slow connection from client = script timeout before file is completely downloaded 的最佳方法是什么

转载 作者:可可西里 更新时间:2023-10-31 22:15:26 24 4
gpt4 key购买 nike

我的客户想要一种向用户提供下载的方法,但前提是他们填写注册表(主要是姓名和电子邮件)。将向用户发送一封电子邮件,其中包含可下载内容的链接。这些链接包含包、文件和用户独有的注册哈希,它们实际上会转到一个 PHP 页面,该页面记录每次下载并通过将文件写入标准输出(连同适当的 header )将文件推出。该解决方案存在固有缺陷,但这就是他们想要的方式。需要说明的是,我向他们施加了很大的压力,以 1.) 限制可下载文件的大小和 2.) 考虑使用 CDN(他们有国际客户,但托管在美国在 2 个镜像服务器和一个使用粘性 IP 的负载平衡器上)。无论如何,它“对我有用”,但他们的一些国际客户的连接速度非常慢(d/l 速率约为 60kB/秒),其中一些文件非常大(150 MB)。由于这是为这些文件提供服务的 PHP 脚本,因此它受脚本超时设置的约束。起初我将其设置为 300 秒(5 分钟),但对于一些测试版用户来说这时间不够。因此,我尝试根据文件大小除以 100kb/sec 连接来计算脚本超时,但其中一些用户甚至比这还慢。

现在客户只想增加超时值。我不想一起删除超时,以防脚本以某种方式进入无限循环。我也不想为某些包罗万象的最低公分母连接速率任意延长超时时间(大多数人的下载速度比 100kb/秒快得多)。而且我还希望能够在某个时候告诉客户“看,这些文件太大了,无法以这种方式处理。这些 40 多分钟的连接会影响网站其余部分的性能。我们要么需要重新考虑它们的交付方式或使用更小的文件。”

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

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

# 的 1-3 很可能会被拒绝或至少被推迟。那么 4 是解决此问题的好方法,还是还有其他我没有考虑过的东西?

(欢迎挑战原解。)

最佳答案

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

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

关于php - 处理此 : large download via PHP + slow connection from client = script timeout before file is completely downloaded 的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3610453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com