Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >处理此问题的最佳方法是什么:在文件完全下载之前,通过PHP +来自client = script超时的缓慢连接进行大规模下载

处理此问题的最佳方法是什么:在文件完全下载之前,通过PHP +来自client = script超时的缓慢连接进行大规模下载
EN

Stack Overflow用户
提问于 2010-08-31 07:17:46
回答 6查看 5K关注 0票数 11

我的客户想要一种方式提供下载给用户,但只有在他们填写注册表格(基本上是姓名和电子邮件)。向用户发送带有可下载内容链接的电子邮件。这些链接包含包、文件和用户特有的注册散列,它们实际上转到一个PHP页面,该页面记录每个下载,并通过将文件写入stdout (以及适当的标头)将文件推送出去。这种解决方案有其固有的缺陷,但这正是他们想要做到的。需要说的是,我把他们逼到了1。)限制可下载文件和2的大小。)考虑使用CDN (他们有国际客户,但在美国托管在两个镜像服务器和一个负载均衡器,使用粘性in )。不管怎样,它“适合我”,但他们的一些国际客户的连接非常慢(d/l速率~60 MB/秒),其中一些文件相当大(150 MB)。因为这是一个为这些文件提供服务的PHP脚本,所以它被脚本超时设置绑定。起初,我把这个设置为300秒(5分钟),但这对一些测试版用户来说是不够的。因此,我尝试根据文件的大小除以100 So /秒的连接来计算脚本超时,但其中一些用户甚至比这还要慢。

现在,客户机只想提高超时值。我不想一起删除超时,以防脚本以某种方式进入无限循环。我也不想继续任意地为某些捕获-所有最低的公共分母连接速率(大多数人下载速度远远快于100 to /秒)的超时。我还想在某个时候告诉客户:“看,这些文件太大了,无法用这种方式处理。这40多分钟的连接会影响到网站其他部分的性能。我们要么需要重新思考它们是如何传递的,要么使用更小的文件。”

我想到了几个解决方案,它们如下:

  1. CDN --将文件移动到CDN服务,如亚马逊或谷歌。我们仍然可以通过PHP记录下载尝试,但随后将浏览器重定向到真正的文件。这样做的一个缺点是,一旦用户有了URL,就可以绕过脚本直接从CDN下载(可以通过查看HTTP报头来收集URL)。这还不错,但不是desired.
  2. Expand服务器场--将服务器场从2扩展到4+服务器,并从负载均衡器中删除粘性IP规则。缺点:这些都是Windows服务器,所以很昂贵。没有理由让它们成为Linux机箱,但是设置所有新的服务器所需的时间可能比客户端为这些下载allow.
  3. Setup 2提供新服务器所需的时间更长--基本上与#2相同,但我们至少可以将网站的其他部分与这个特定的进程隔离开来(并调整新服务器的配置)。我们还可以很容易地让这些Linux boxes.
  4. Detect成为用户连接速率--我想到了一种检测用户当前速度的方法,方法是在下载登陆页面上使用AJAX,知道下载一个已知文件大小的静态文件需要多长时间,然后将该信息发送到服务器,并根据该信息计算超时时间。这并不理想,但它比估计连接速度过高或过低要好。不过,我不知道如何将速度信息返回到服务器,因为我们目前使用的是从服务器发送的重定向头。

有可能#的1-3会被拒绝,或者至少会被推开。那么4是一个很好的方法来做这件事,还是有什么我没有考虑过的?

(可以随时挑战原来的解决方案。)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-08-31 07:35:38

使用X-SENDFILE。大多数will服务器都会支持它,或者是通过插件(apache)。

使用这个标题,您可以简单地指定一个本地文件路径并退出PHP脚本。and服务器将看到标题并提供该文件。

票数 3
EN

Stack Overflow用户

发布于 2010-08-31 07:24:33

简单的解决方案是禁用超时。您可以根据请求执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set_time_limit(0);

如果您的脚本没有错误,那么这就没有问题了--除非您的服务器由于客户端速度慢而无法处理这么多并发连接。

在这种情况下,#1,#2和#3是两个很好的解决方案,我会选择哪个更便宜。您对#1的担忧可以通过生成只能使用一次或一小段时间的下载令牌来缓解。

在我看来,选项4并不是一个很好的选择。在下载过程中,速度可能会有很大的差异,所以您最初所做的任何估计都是错误的,而且很可能是错误的。

票数 1
EN

Stack Overflow用户

发布于 2010-08-31 07:31:08

我对#4有点保留。攻击者可以伪造一个假AJAX请求,将您的超时设置为一个非常高的值,然后他可以让您进入一个无限循环。(如果你一开始就担心的话)

我建议一种类似于@prodigitalson的解决方案。您可以使用散列值/downloads/389a002392ag02/myfile.zip创建目录,该哈希值是指向实际文件的符号链接。PHP脚本重定向到由HTTP服务器提供服务的文件。符号链接定期被删除。

创建目录而不是创建文件的另一个好处是,最终用户不会看到损坏的文件名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3610453

复制
相关文章
python读取txt文件中的数组
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139543.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/23
4K0
OpenCV中图像的读取,显示与保存
相关函数:cv2.imread()、cv2.imshow()、cv2.imwrite()
py3study
2020/01/19
2.9K0
如何同时从多个文本文件读取数据
在很多时候,需要对多个文件进行同样的或者相似的处理。例如,你可能会从多个文件中选择数据子集,根据多个文件计算像总计和平均值这样的统计量。当文件数量增加时,手动处理文件的可能性会减小,出错的概率会增加。
TalkPython
2019/05/24
3.9K0
OpenCV中如何读取URL图像文件
最近知识星球收到的提问,觉得是一个很有趣的问题,就通过搜集整理归纳了一番,主要思想是通过URL解析来生成数据,转为图像/Mat对象。但是在Python语言与C++语言中的做法稍有不同。
OpenCV学堂
2019/07/19
5.9K0
如何利用C/C++逐行读取txt文件中的字符串(可以顺便实现文本文件的复制)
本文代码都在Windows/VC++6.0下测试过, 在linux/g++下也没有问题。
全栈程序员站长
2022/09/05
4.3K0
Python Numpy 从文件中读取数据
测试文件内容(test1.txt) hello,123,nihao 8,9,10 io,he,no 测试代码 import numpy # dtype:默认读取数据类型,delimiter:分隔符 world_alcohol = numpy.genfromtxt("test1.txt", dtype=str, delimiter=",") # 数据结构 print(type(world_alcohol)) # 数据内容 print(world_alcohol) # 帮助文档 print(help(nump
山海散人
2021/03/03
4.2K0
TensorFlow中读取图像数据的三种方式
从tesorflow1.11之后,(大概是这个版本号),谷歌推出了tf.data模块来读取数据,甚至在tensorflow2.0中,取消了数据队列管道,所以我建议大家学习tf.data模块。未来我也会做详细的tf.data模块使用说明。
狼啸风云
2020/12/29
7520
进程中的数据读取和修改
// 获取窗口句柄 HWND hFindWnd = ::FindWindow(NULL, “[窗口标题]”);
ClearSeve
2022/02/16
8580
C#读取文本文件和C# 写文本文件
今天一个学生问我如何从一个文本中读取内容,如下是做的是控制台中的例子,在别的地方也是这个道理。
阳光岛主
2019/02/19
3.5K0
TypeScript中的数组和元组
TypeScript像JavaScript一样可以操作数组元素。 有两种方式可以定义数组。
玖柒的小窝
2021/11/16
2.2K0
TypeScript中的数组和元组
Java中的数组和集合
这创建了一个名为 array 的整型数组,该数组有 5 个元素。可以使用下标访问数组中的元素,例如:array[0] 表示第一个元素,array[1] 表示第二个元素,以此类推。数组下标从 0 开始,因此最后一个元素的下标是 array.length - 1。
小尘要自信
2023/10/10
2710
Golang中的数组和切片
(2)数组是值类型,将一个数组赋值给另一个数组时,会将所有的元素进行复制;切片是引用类型,将一个切片赋值给另一个切片时,它们将共享底层数组。
周小末天天开心
2023/10/16
1820
按出现次数从少到多的顺序输出数组中的字符串
问题 有一个数组为{"Liu Yi", "Chen Er", "Zhang San", "Chen Er", "Chen Er", "Li Si", "Li Si", "Wang Wu"}, 要求: (1)把数组中没重复的字符串按原先的先后顺序打印出来 (2)把数组中有重复的字符串,按出现次数从少到多的顺序打印出来,每个字符串只打印一次 思路 C++中,vector按先后顺序存储数据,因此可把没重复的字符串按顺序存到vector中。 map默认是按key从小到大的顺序存放数据,所以可把有重复的数据存到map
海天一树
2018/04/17
2.5K0
用Pandas从HTML网页中读取数据
本文,我们将通过几步演示如何用Pandas的read_html函数从HTML页面中抓取数据。首先,一个简单的示例,我们将用Pandas从字符串中读入HTML;然后,我们将用一些示例,说明如何从Wikipedia的页面中读取数据。
老齐
2020/05/15
9.6K0
用Pandas从HTML网页中读取数据
java中怎么输入数组_java中如何从键盘输入数组
java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。
全栈程序员站长
2022/09/13
4K0
Java 读取文本文件
我想用Java 读取文本文件(txt)中的字符,但是对Java的文件操作不怎么熟悉,于是开始翻官方文档,解决了如何从文件中读取一行或者全部数据的问题。
全栈程序员站长
2022/06/25
1.8K0
Java 读取文本文件
C#中的多维数组和交错数组
C#中有多维数组和交错数组,两者有什么区别呢! 直白些,多维数组每一行都是固定的,交错数组的每一行可以有不同的大小。 以二维的举例,二维数组就是m×n的矩阵,m行n列;而交错数组(又叫锯齿数组
卡尔曼和玻尔兹曼谁曼
2019/01/22
2.9K0
C#中的多维数组和交错数组
leetcode:1408. 数组中的字符串匹配
给你一个字符串数组 words ,数组中的每个字符串都可以看作是一个单词。请你按 任意 顺序返回 words 中是其他单词的子字符串的所有单词。
冷环渊
2021/12/12
2.2K0
C++中的数组和字符串,strlen函数,iostream头文件
C++语法是在C语言的基础上发展而来的,被称为“带类的C”,兼容C语言语法。本文介绍数组和字符串的基本知识。
全栈程序员站长
2022/07/23
2K0
点击加载更多

相似问题

从文本文件中读取和写入字符串

2111

从文本文件中读取和显示字符串

10

从文本文件中读取np数组

315

如何从文本文件中读取数组?

48

如何从文本文件中读取和添加数组中的数字

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文