PHP-Downloadscript - 下载限制不起作用

时间:2012-09-29 17:23:51

标签: php

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

 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)”时,下载开始,一切都很好,但它以全速运行。 - >逻辑!

为什么会这样?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您可能希望首先尝试添加@ob_flush_end()以禁用输出缓冲,并在循环中删除@ob_flush()。延迟可能是因为输出缓冲。

您也可以尝试将print替换为echo。您可能会获得一些性能提升。

同时尝试使用较小的块并使用usleep来缩短延迟时间。