php大文件下载超时

问题描述 投票:2回答:3

第一次发布,如果发现任何错误,抱歉。

我正在尝试创建一个安全的文件下载店面。实际上,它可以工作,但仅适用于小文件。我有1.9gb产品要下载,并且在传输过程中一直停下来。大小也不一致,我的最大容量为1GB,但通常为200-500mb。

目的是创建一个空间,只有拥有注册帐户的用户才能下载文件,因此无法直接链接。

我在本网站的其他地方读到,在文件读取循环中重置脚本超时应该绕过脚本时间限制。

try
{
    $num_bytes = filesize ("products/" . $filename);
    $mp3content = fopen("products/" . $filename, "rb") or die("Couldn't get handle");
    $bytes_read=0;
    if ($mp3content) {
        while (!feof($mp3content)) {
            set_time_limit(30);
            $buffer = fread($mp3content, 4096);
            echo $buffer;
            $bytes_read+=4096;
        }
        fclose($handle);
    }
}
catch (Exception $e)
{
    error_log("User failed to download file: " . $row['FILENAME'] . "(" . $row['MIMETYPE'] . ")\n" . $e, 1, getErrorEmail());
}

error_log("Bytes downloaded:" . $bytes_read . " of " . $num_bytes, 1, getErrorEmail());

我没有收到有关失败的大型文件的最终错误日志电子邮件,但是我确实收到了有关成功的较小文件的电子邮件,因此我知道代码在原则上是可行的。

php file-io stream download digital-downloads
3个回答
1
投票

原来我的托管是问题。 PHP代码是正确的,但是我的共享托管环境将所有php脚本限制为30秒,在上述代码的情况下,该过程大约需要15分钟。除非有人能提出一种使PHP捆绑在对计时器没有帮助的文件处理方法中的方法,否则看起来这很困难。


0
投票

尝试这个

set_time_limit(0);

0
投票

我遇到了同样的问题,所以我想到了不同的方法。当请求文件时,我在“下载”文件夹中的随机命名目录中建立文件的硬链接,并为用户提供4个小时的链接。

文件URL这样完成。

http://example.com/downloads/3nd83js92kj29dmcb39dj39/myfile.zip

每次调用该脚本都会解析“下载”文件夹,并删除所有具有超过4个小时创建时间的文件夹及其内容,以保持文件的清洁。

这对于暴力攻击并不安全,但是可以解决。

© www.soinside.com 2019 - 2024. All rights reserved.