2

当我使用这个 phpcode 下载一个下载速度为 300Kb/si 的文件时,使用这个:

 function readfile_chunked($dl_link, $filesize_file) {
  $chunksize = 300*1024; #Buffersize in Byte 
  $data = '';
  $handle = fopen($dl_link, 'rb');
    while (!feof($handle)) {
      $data = fread($handle, $chunksize);
      sleep(1);
      print $data;
      @ob_flush();
      @flush();
    }
  fclose($handle);
 }

但它不起作用!:-(

当我开始下载时,速度低于 1 KB/s,它会中断然后恢复,依此类推。

当我在上面的代码中取消这个“sleep(1)”时,下载开始并且一切都很好,但它以全速运行。-> 合乎逻辑!

为什么是这样?

4

2 回答 2

2

这看起来基本没问题,但是请尝试以下操作:

function readfile_chunked($path, $speed)
{
    if (is_file($path) !== true)
    {
        exit('not a local file');
    }

    header('Pragma: public');
    header('Cache-Control: public, no-cache');
    header('Content-Type: application/octet-stream');
    header('Content-Length: ' . filesize($path));
    header('Content-Disposition: attachment; filename="' . basename($path) . '"');
    header('Content-Transfer-Encoding: binary');

    $handle = fopen($path, 'rb');

    while (!feof($handle))
    {
        echo fread($handle, $speed * 1024); sleep(1);

        while (ob_get_level() > 0)
        {
            ob_end_flush();
        }

        flush();
    }

    fclose($handle);
}

readfile_chunked('/path/to/your/file.ext', 300);
于 2012-09-29T17:37:41.153 回答
0

您可能想先尝试添加@ob_flush_end()以禁用输出缓冲,然后@ob_flush()在循环中删除。延迟可能是由于输出缓冲。

您也可以尝试替换printecho. 您可能会获得一些性能改进。

还可以尝试使用更小的块并使用usleep更短的延迟时间。

于 2012-09-29T17:54:19.557 回答