fread()下载一千兆字节后中止

时间:2018-01-03 16:08:14

标签: php file download buffer fread

我目前遇到的问题是我的下载总是停在几乎一千兆字节。我创建了一个PHP下载脚本,它在下载之前检查用户权限,然后阻止复制URL。为此,我使用fread()通过PHP传递数据。但是,我不知道为什么下载总是在一千兆字节后完全停止。该文件大约是文件的两倍。

有人可以看看这个吗?

// ... Permission check, get download url, etc. ...

try 
{
    define('CHUNK_SIZE', 8 * 1024);

    function readfile_chunked($filename, $retbytes = true) 
    {
        $buffer = '';
        $cnt    = 0;
        $handle = fopen($filename, 'rb');

        if ($handle === false) 
        {
            return false;
        }

        while (!feof($handle)) 
        {
            $buffer = fread($handle, CHUNK_SIZE);
            echo $buffer;

            if(ob_get_level() > 0)
            {
                ob_flush();
                flush();
            }

            if ($retbytes) 
            {
                $cnt += strlen($buffer);
            }
        }

        $status = fclose($handle);

        if ($retbytes && $status) 
        {
            return $cnt;
        }

        return $status;
    }

    $mimetype = 'mime/type';
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . $download->url);

    readfile_chunked($download->url);
} 
catch(Exception $e) 
{
    echo "Error while reading the file";
    exit;
}

更新:

我现在已经在另一台服务器上测试了该脚本。这里的下载有时在300 MB之后终止,有时在1.3 GB之后终止。然后我定义了以下设置:

ini_set('display_errors', 0);
ini_set('error_reporting', E_ALL);
ini_set("log_errors", 1);
ini_set("error_log", "error.log");
ini_set('memory_limit', '-1');
ini_set('max_execution_time', 7200);

在另一台服务器上,脚本现在已经运行了几次而没有任何问题。下载完成,文件没有错误。但是,我将这些设置复制到原始系统,下载仍然停止。我连续三次下载了这个文件。文件大小略有不同:

  • 1.057.983 KB
  • 1.056.192 KB
  • 1.056.776 KB

我的想法已经不多了。还有什么呢?它们都是Apache Web服务器。

日志中也没有明显的条目。

0 个答案:

没有答案