我的客户想要一种方式提供下载给用户,但只有在他们填写注册表格(基本上是姓名和电子邮件)。向用户发送带有可下载内容链接的电子邮件。这些链接包含包、文件和用户特有的注册散列,它们实际上转到一个PHP页面,该页面记录每个下载,并通过将文件写入stdout (以及适当的标头)将文件推送出去。这种解决方案有其固有的缺陷,但这正是他们想要做到的。需要说的是,我把他们逼到了1。)限制可下载文件和2的大小。)考虑使用CDN (他们有国际客户,但在美国托管在两个镜像服务器和一个负载均衡器,使用粘性in )。不管怎样,它“适合我”,但他们的一些国际客户的连接非常慢(d/l速率~60 MB/秒),其中一些文件相当大(150 MB)。因为这是一个为这些文件提供服务的PHP脚本,所以它被脚本超时设置绑定。起初,我把这个设置为300秒(5分钟),但这对一些测试版用户来说是不够的。因此,我尝试根据文件的大小除以100 So /秒的连接来计算脚本超时,但其中一些用户甚至比这还要慢。
现在,客户机只想提高超时值。我不想一起删除超时,以防脚本以某种方式进入无限循环。我也不想继续任意地为某些捕获-所有最低的公共分母连接速率(大多数人下载速度远远快于100 to /秒)的超时。我还想在某个时候告诉客户:“看,这些文件太大了,无法用这种方式处理。这40多分钟的连接会影响到网站其他部分的性能。我们要么需要重新思考它们是如何传递的,要么使用更小的文件。”
我想到了几个解决方案,它们如下:
有可能#的1-3会被拒绝,或者至少会被推开。那么4是一个很好的方法来做这件事,还是有什么我没有考虑过的?
(可以随时挑战原来的解决方案。)
发布于 2010-08-31 07:35:38
使用X-SENDFILE。大多数will服务器都会支持它,或者是通过插件(apache)。
使用这个标题,您可以简单地指定一个本地文件路径并退出PHP脚本。and服务器将看到标题并提供该文件。
发布于 2010-08-31 07:24:33
简单的解决方案是禁用超时。您可以根据请求执行以下操作:
set_time_limit(0);
如果您的脚本没有错误,那么这就没有问题了--除非您的服务器由于客户端速度慢而无法处理这么多并发连接。
在这种情况下,#1,#2和#3是两个很好的解决方案,我会选择哪个更便宜。您对#1的担忧可以通过生成只能使用一次或一小段时间的下载令牌来缓解。
在我看来,选项4并不是一个很好的选择。在下载过程中,速度可能会有很大的差异,所以您最初所做的任何估计都是错误的,而且很可能是错误的。
发布于 2010-08-31 07:31:08
我对#4有点保留。攻击者可以伪造一个假AJAX请求,将您的超时设置为一个非常高的值,然后他可以让您进入一个无限循环。(如果你一开始就担心的话)
我建议一种类似于@prodigitalson的解决方案。您可以使用散列值/downloads/389a002392ag02/myfile.zip
创建目录,该哈希值是指向实际文件的符号链接。PHP脚本重定向到由HTTP服务器提供服务的文件。符号链接定期被删除。
创建目录而不是创建文件的另一个好处是,最终用户不会看到损坏的文件名。
https://stackoverflow.com/questions/3610453
复制相似问题