我正在为我的公司开发文件上传服务。我们的用户经常向我们发送非常大的.zip文件,其中包含非常大的插图文件。通常文件不会大于1.5GB,但我需要计划处理高达4GB的文件。
显然,这引起了很多关于我如何配置我的Apache以允许这样大的文件传输而不会使我的服务器过载或打开安全漏洞的担忧。
关注1:内存限制
我的系统的一个功能是用户应该能够在上传文件后将其下载回来。由于安全问题,我避免使用标准下载(只是链接到文件) - 我不能让其他用户下载其他文件。我的解决方案是将上传的文件保存在www-root之外的受保护目录中,并通过PHP脚本加载它们。 PHP脚本看起来有点像这样:
$fo = fopen($uploadDir.$file_name, "r");
while(!feof($fo)) {
$strang = fread($fo, 102400);
echo $strang;
ob_flush();
}
fclose($fo);
我已经将fread放入循环并将其锁定为一次只加载文件的小块。我这样做是因为我的服务器只有4GB的RAM,并且需要能够同时处理多个人下载(可能最多20个人)。我的第一个问题是我应该一次读取多大块。由于块大小,现在下载1.5GB文件的速度非常慢。
关注2:最长执行时间
上传/下载此类大文件的另一个问题是最长执行时间。虽然我的内部网络上的一切都很快,但我应该为连接速度慢的用户做好准备。我将我的低端上传速率设置为1Mbps,上传大约需要35分钟。让我们慷慨,并说他们可以以两倍的速度下载,所以下载15分钟。
将max_excution_time设置为30分钟是否存在安全风险?是否会在我的服务器上杀死任何东西?我没有任何理由认为这是一个坏主意,但我的直觉只是尖叫我允许脚本运行那么久我会很愚蠢。有没有更好的方法来做我想做的事情?
我看过其他几个类似的问题,其中大多数建议使用像java或silverlight这样的东西。我想,如果有任何明智的方法,避免java。我目前正在使用swfupload和随附的jQuery插件。
答案 0 :(得分:1)
关注1:内存限制
readfile
个流,因此它会动态转换为HTTP响应,并且不会被加载到已完成的内存中。
但是对于上传,脚本必须有足够的内存,因为在上传和使用PHP时,如果我没记错的话,整个文件会进入内存。
关注2:最长执行时间
如果您担心安全性,请通过HTTPD服务器处理身份验证和访问权限。然后,当请求无效时,您的脚本将不会被执行。