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()にし、ループで削除することをお勧めします。遅延は、出力バッファリングが原因である可能性があります。

printに置き換えてみることもできますecho。パフォーマンスが向上する場合があります。

また、より小さなチャンクを試して、usleep代わりに短い遅延時間を使用してください。

于 2012-09-29T17:54:19.557 に答える